//v.1.3 build 100805

/*
Copyright DHTMLX LTD. http://www.dhtmlx.com
To use this component please contact sales@dhtmlx.com to obtain license
*/

function GanttProjectInfo(id, name, startDate)
{
    this.Id = id;
    this.Name = name;
    this.StartDate = startDate;
    this.ParentTasks = []
};
    
GanttProjectInfo.prototype.deleteTask = function(id)

{
        var task = this.getTaskById(id);
        if (task){
            if (!task.ParentTask){
                for (var i = 0;i < this.ParentTasks.length;i++){
                    if (this.ParentTasks[i].Id == id){
                        if (this.ParentTasks[i].nextParentTask){
                            if (this.ParentTasks[i].previousParentTask){
                                this.ParentTasks[i].previousParentTask.nextParentTask = this.ParentTasks[i].nextParentTask;
                                this.ParentTasks[i].nextParentTask.previousParentTask = this.ParentTasks[i].previousParentTask
                            }else {
                                this.ParentTasks[i].nextParentTask.previousParentTask = null
                            }
                        }else {
                            if (this.ParentTasks[i].previousParentTask){
                                this.ParentTasks[i].previousParentTask.nextParentTask = null
                            }
                        };
                
                        this.ParentTasks[i] = null;
                        this.ParentTasks.splice(i, 1);
                        break
                    }
                }
            }else
            {
                var parentTask = task.ParentTask;
                for (var i = 0;i < parentTask.ChildTasks.length;i++){
                    if (parentTask.ChildTasks[i].Id == id){
                        if (parentTask.ChildTasks[i].nextChildTask){
                            if (parentTask.ChildTasks[i].previousChildTask){
                                parentTask.ChildTasks[i].previousChildTask.nextChildTask = parentTask.ChildTasks[i].nextChildTask;
                                parentTask.ChildTasks[i].nextChildTask.previousChildTask = parentTask.ChildTasks[i].previousChildTask
                            }else {
                                parentTask.ChildTasks[i].nextChildTask.previousChildTask = null
                            }
                        }else {
                            if (parentTask.ChildTasks[i].previousChildTask){
                                parentTask.ChildTasks[i].previousChildTask.nextChildTask = null
                            }
                        };
        
                        parentTask.ChildTasks[i] = null;
                        parentTask.ChildTasks.splice(i, 1);
                        break
                    }
                }
            }
        }
    };

GanttProjectInfo.prototype.addTask = function(task)

{
        this.ParentTasks.push(task);
        task.setProject(this)
    };
    
GanttProjectInfo.prototype.getTaskById = function(id)

{
        for (var j = 0;j < this.ParentTasks.length;j++){
            var task = this.getTaskByIdInTree(this.ParentTasks[j], id);
            if (task)return task
        };
            
        return null
    };
    
GanttProjectInfo.prototype.getTaskByIdInTree = function(parentTask, id)

{
        if (parentTask.Id == id){
            return parentTask
        }else

        {
            for (var i = 0;i < parentTask.ChildTasks.length;i++){
                if (parentTask.ChildTasks[i].Id == id){
                    return parentTask.ChildTasks[i]
                };
                
                if (parentTask.ChildTasks[i].ChildTasks.length > 0){
                    if (parentTask.ChildTasks[i].ChildTasks.length > 0){
                        var cTask = this.getTaskByIdInTree(parentTask.ChildTasks[i], id);
                        if (cTask)return cTask
                    }
                }
            }
        };

        return null
    };

function GanttTaskInfo(id, name, est, duration, percentCompleted, predecessorTaskId)
{
    this.Id = id;
    this.Name = name;
    this.EST = est;
    this.Duration = duration;
    this.PercentCompleted = percentCompleted;
    this.PredecessorTaskId = predecessorTaskId;
    this.ChildTasks = [];
    this.ChildPredTasks = [];
    this.ParentTask = null;
    this.PredecessorTask = null;
    this.Project = null;
    this.nextChildTask = null;
    this.previousChildTask = null;
    this.nextParentTask = null;
    this.previousParentTask = null
};
    
GanttTaskInfo.prototype.addChildTask = function(task)

{
        this.ChildTasks.push(task);
        task.ParentTask = this
    };
    
GanttTaskInfo.prototype.setProject = function(project)

{
        this.Project = project;
        for (var j = 0;j < this.ChildTasks.length;j++){
            this.ChildTasks[j].setProject(project)
        }
    };
    
function GanttTask(taskInfo, project, chart)
{
    this.isTask = true;
    this.Chart = chart;
    this.Project = project;
    this.TaskInfo = taskInfo;
    this.checkMove = false;
    this.checkResize = false;
    this.moveChild = false;
    this.maxPosXMove = -1;
    this.minPosXMove = -1;
    this.maxWidthResize = -1;
    this.minWidthResize = -1;
    this.posX = 0;
    this.posY = 0;
    this.MouseX = 0;
    this.taskItemWidth = 0;
    this.isHide = false;
    this._heightHideTasks = 0;
    this._isOpen = true;
    this.descrTask = null;
    this.cTaskItem = null;
    this.cTaskNameItem = null;
    this.parentTask = null;
    this.predTask = null;
    this.childTask = [];
    this.childPredTask = [];
    this.nextChildTask = null;
    this.previousChildTask = null;
    this.nextParentTask = null;
    this.previousParentTask = null
};
    
function GanttProject(Chart, projectInfo)
{
    this.isProject = true;
    this.nextProject = null;
    this.previousProject = null;
    this.arrTasks = [];
    this.Project = projectInfo;
    this.Chart = Chart;
    this.percentCompleted = 0;
    this.Duration = 0;
    this.descrProject = null;
    this.projectItem = null;
    this.projectNameItem = null;
    this.posY = 0;
    this.posX = 0
};
    
GanttProject.prototype.checkWidthProjectNameItem = function()

{
        if (this.projectNameItem.offsetWidth + this.projectNameItem.offsetLeft > this.Chart.maxWidthPanelNames){
            var width = this.projectNameItem.offsetWidth + this.projectNameItem.offsetLeft - this.Chart.maxWidthPanelNames;
            var countChar = Math.round(width / (this.projectNameItem.offsetWidth / this.projectNameItem.firstChild.length));
            var pName = this.Project.Name.substring(0, this.projectNameItem.firstChild.length - countChar - 3);
            pName += "...";
            this.projectNameItem.innerHTML = pName
        }
    };

GanttProject.prototype.create = function()

{
        var containerTasks = this.Chart.oData.firstChild;
        this.posX = (this.Project.StartDate - this.Chart.startDate) / (60 * 60 * 1000) * this.Chart.hourInPixels;
        if (this.previousProject){
            if (this.previousProject.arrTasks.length > 0){
                var lastChildTask = this.Chart.getLastChildTask(this.previousProject.arrTasks[this.previousProject.arrTasks.length - 1]);
                this.posY = parseInt(lastChildTask.cTaskItem[0].style.top) + this.Chart.heightTaskItem + 11
            }else {
                this.posY = parseInt(this.previousProject.projectItem[0].style.top) + this.Chart.heightTaskItem + 11
            }
        }else {
            this.posY = 6
        };
    
        if (this.Chart._showTreePanel){
            var containerNames = this.Chart.panelNames.firstChild;
            this.projectNameItem = this.createProjectNameItem();
            containerNames.appendChild(this.projectNameItem);
            this.checkWidthProjectNameItem()
        };
    
        this.projectItem = [this.createProjectItem(),[]];
        containerTasks.appendChild(this.projectItem[0]);
        if (this.Chart.isShowDescProject){
            containerTasks.appendChild(this.createDescrProject())
        };
    
        this.addDayInPanelTime()
    };
    
function GanttChart()
{
    this.Error = new GanttError();
    this.dhtmlXMLSenderObject = new dhtmlXMLSenderObject(this);
    this.heightTaskItem = 12;
    this.dayInPixels = 24;
    this.hoursInDay = 8;
    this._showTreePanel = true;
    this._showTooltip = true;
    this.isShowDescTask = false;
    this.isShowDescProject = false;
    this.isShowNewProject = true;
    this.isEditable = false;
    this.isShowConMenu = false;
    this.correctError = false;
    this.maxWidthPanelNames = 150;
    this.minWorkLength = 8;
    this.paramShowTask = [];
    this.paramShowProject = [];
    this.savePath = null;
    this.loadPath = null;
    this.divTimeInfo = null;
    this.divInfo = null;
    this.panelNames = null;
    this.panelTime = null;
    this.oData = null;
    this.content = null;
    this.panelErrors = null;
    this.contextMenu = null;
    this.hourInPixelsWork = this.dayInPixels / this.hoursInDay;
    this.hourInPixels = this.dayInPixels / 24;
    this.countDays = 0;
    this.startDate = null;
    this.initialPos = 0;
    this.contentHeight = 0;
    this.contentWidth = 0;
    this._oDataHeight = 0;
    this.Project = [];
    this.arrProjects = [];
    this.xmlLoader = null;
    this._isIE = false;
    this._isFF = false;
    this._isOpera = false;
    this._isMove = false;
    this._isResize = false;
    this._isError = false;
    this.imgs = "codebase/imgs/";
    this.stylePath = "codebase/dhtmlxgantt.css";
    this.shortMonthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
    this.monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    this._useShortMonthNames = true;
    dhtmlxEventable(this)
};
    
GanttChart.prototype.setImagePath = function(newPath)

{
        this.imgs = newPath
    };
    
GanttChart.prototype.setStylePath = function(newPath)

{
        this.stylePath = newPath
    };
    
GanttChart.prototype.setSavePath = function(newPath)

{
        this.savePath = newPath
    };
    
GanttChart.prototype.setLoadPath = function(newPath)

{
        this.loadPath = newPath
    };
    
GanttChart.prototype.setCorrectError = function(isCorrectError)

{
        this.correctError = isCorrectError
    };
    
GanttChart.prototype.showDescTask = function(isShowDescTask, param)

{
        this.isShowDescTask = isShowDescTask;
        var arrValues = new Array(5);
        if (this.isShowDescTask){
            if (param){
                var arrParam = param.split(",");
                for (var i = 0;i < arrParam.length;i++){
                    var k = this.getParamShowTask(arrParam[i]);
                    arrValues[k] = 1
                }
            }else {
                arrValues[this.getParamShowTask('')] = 1
            };
        
            this.paramShowTask = this.getValueShowTask(arrValues)
        }
    };

GanttChart.prototype.showDescProject = function(isShowDescProject, param)

{
        this.isShowDescProject = isShowDescProject;
        var arrValues = new Array(4);
        if (this.isShowDescProject){
            if (param){
                var arrParam = param.split(",");
                for (var i = 0;i < arrParam.length;i++){
                    var k = this.getParamShowProject(arrParam[i]);
                    arrValues[k] = 1
                }
            }else {
                arrValues[this.getParamShowProject('')] = 1
            };
        
            this.paramShowProject = this.getValueShowProject(arrValues)
        }
    };

GanttChart.prototype.showContextMenu = function(show)

{
        this.isShowConMenu = show
    };
    
GanttChart.prototype.setContextMenu = function(menu)

{
        this.showContextMenu(true);
        this.contextMenu = menu
    };
    
GanttChart.prototype.showNewProject = function(show)

{
        this.isShowNewProject = show
    };
    
GanttChart.prototype.getParamShowTask = function(param)

{
        switch (param) {
            case 'n':
 
                return 0;
                break;
            case 'd':
 
                return 1;
                break;
            case 'e':
 
                return 2;
                break;
            case 'p':
 
                return 3;
                break;
            case 's-f':
 
                return 4;
                break;
            default:
                return 0;
                break
        }
    };

GanttChart.prototype.getParamShowProject = function(param)

{
        switch (param) {
            case 'n':
 
                return 0;
                break;
            case 'd':
 
                return 1;
                break;
            case 's':
 
                return 2;
                break;
            case 'p':
 
                return 3;
                break;
            default:
                return 0;
                break
        }
    };

GanttChart.prototype.getValueShowTask = function(param)

{
        var arrValues = [];
        for (var i = 0;i < param.length;i++){
            if (param[i]){
                switch (i) {
                    case 0:
                        arrValues.push('Name');
                        break;
                    case 1:
                        arrValues.push('Duration');
                        break;
                    case 2:
                        arrValues.push('EST');
                        break;
                    case 3:
                        arrValues.push('PercentComplete');
                        break;
                    case 4:
                        arrValues.push('S-F');
                        break;
                    default:
                        break
                }
            }
        };
    
        return arrValues
    };

GanttChart.prototype.getValueShowProject = function(param)

{
        var arrValues = [];
        for (var i = 0;i < param.length;i++){
            if (param[i]){
                switch (i) {
                    case 0:
                        arrValues.push('Name');
                        break;
                    case 1:
                        arrValues.push('Duration');
                        break;
                    case 2:
                        arrValues.push('StartDate');
                        break;
                    case 3:
                        arrValues.push('PercentComplete');
                        break;
                    default:
                        break
                }
            }
        };
    
        return arrValues
    };

GanttChart.prototype.setEditable = function(isEditable)

{
        this.isEditable = isEditable
    };
    
GanttChart.prototype.showTreePanel = function(show)

{
        this._showTreePanel = show
    };
    
GanttChart.prototype.showTooltip = function(show)

{
        this._showTooltip = show
    };
    
GanttChart.prototype.getProjectById = function(id)

{
        for (var i = 0;i < this.arrProjects.length;i++){
            if (this.arrProjects[i].Project.Id == id){
                return this.arrProjects[i]
            }
        };
    
        return null
    };

GanttChart.prototype.getBrowserType = function()

{
        if (navigator.appName.indexOf('Explorer')!= -1)

        {
            this._isIE = true
        }else if (navigator.userAgent.indexOf('Mozilla')!= -1)

        {
            this._isFF = true
        }else if (navigator.userAgent.indexOf('Opera')!= -1)

        {
            this._isOpera = true
        }
    };

GanttChart.prototype.addProject = function(projectInfo)

{
        this.Project.push(projectInfo)
    };
    
GanttProject.prototype.deleteTask = function(id)

{
        var task = this.getTaskById(id);
        if (task){
            this.deleteChildTask(task)
        }else {
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 30, [id])
        }
    };

GanttChart.prototype.deleteProject = function(id)

{
        var project = this.getProjectById(id);
        if (project){
            if (project.arrTasks.length > 0){
                while (project.arrTasks.length > 0){
                    project.deleteChildTask(project.arrTasks[0])
                }
            };
        
            if (project.nextProject)project.shiftNextProject(project, -23);
            for (var i = 0;i < this.Project.length;i++){
                if (this.Project[i].Id == project.Project.Id){
                    this.Project.splice(i, 1)
                }
            };
    
            if ((project.previousProject)&&
                (project.nextProject))
                {
                var previousProject = project.previousProject;
                previousProject.nextProject = project.nextProject
            };
    
            if ((project.previousProject)&&
                !(project.nextProject))
                {
                var previousProject = project.previousProject;
                previousProject.nextProject = null
            };
    
            if (!(project.previousProject)&&
                (project.nextProject))
                {
                var nextProject = project.nextProject;
                nextProject.previousProject = null
            };
    
            for (var i = 0;i < this.arrProjects.length;i++){
                if (this.arrProjects[i].Project.Id == id){
                    this.arrProjects.splice(i, 1)
                }
            };

            project.projectItem[0].parentNode.removeChild(project.projectItem[0]);
            if (this.isShowDescProject){
                project.descrProject.parentNode.removeChild(project.descrProject)
            };
    
            if (this._showTreePanel){
                project.projectNameItem.parentNode.removeChild(project.projectNameItem)
            };
    
            this._oDataHeight -= 11 + this.heightTaskItem;
            if (this.Project.length == 0){
                if (this.isShowNewProject){
                    var d = new Date(this.startDate);
                    var t = new Date(d.setDate(d.getDate() + 1));
                    var pi = new GanttProjectInfo(1, "New project", t);
                    this.Project.push(pi);
                    var project = new GanttProject(this, pi);
                    project.create();
                    this.arrProjects.push(project);
                    this._oDataHeight += 11 + this.heightTaskItem
                }
            }
        }else {
            this.Error.throwError("DATA_INSERT_ERROR", 31, [id])
        }
    };

GanttProject.prototype.setName = function(name)

{
        if ((name != "")&& (name != null)) {
            this.Project.Name = name;
            if (this.Chart._showTreePanel){
                this.projectNameItem.innerHTML = name;
                this.projectNameItem.title = name;
                this.checkWidthProjectNameItem()
            };
            
            if (this.Chart.isShowDescProject)this.descrProject.innerHTML = this.getDescStr();
            this.addDayInPanelTime()
        }
    };

GanttProject.prototype.setPercentCompleted = function(percentCompleted)

{
        percentCompleted = parseInt(percentCompleted);
        if (isNaN(percentCompleted))

        {
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 6, null);
            return false
        };
        
        if (percentCompleted > 100){
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 7, null);
            return false
        }else if (percentCompleted < 0){
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 8, null);
            return false
        };
        
        if ((percentCompleted > 0)&& (percentCompleted < 100) && (this.percentCompleted > 0) && (this.percentCompleted < 100))

        {
            this.projectItem[0].firstChild.rows[0].cells[0].width = parseInt(percentCompleted) + "%";
            this.projectItem[0].firstChild.rows[0].cells[0].firstChild.style.width = (percentCompleted * this.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
            this.projectItem[0].firstChild.rows[0].cells[1].width = (100 - parseInt(percentCompleted)) + "%";
            this.projectItem[0].firstChild.rows[0].cells[1].firstChild.style.width = ((100 - percentCompleted) * this.Duration * this.Chart.hourInPixelsWork) / 100 + "px"
        }else if (((percentCompleted == 0)|| (percentCompleted == 100)) && (this.percentCompleted > 0) && (this.percentCompleted < 100))

        {
            if (percentCompleted == 0){
                this.projectItem[0].firstChild.rows[0].cells[0].parentNode.removeChild(this.projectItem[0].firstChild.rows[0].cells[0]);
                this.projectItem[0].firstChild.rows[0].cells[0].width = 100 + "%";
                this.projectItem[0].firstChild.rows[0].cells[0].firstChild.style.width = this.Duration * this.Chart.hourInPixelsWork + "px"
            }else if (percentCompleted == 100){
                this.projectItem[0].firstChild.rows[0].cells[1].parentNode.removeChild(this.projectItem[0].firstChild.rows[0].cells[1]);
                this.projectItem[0].firstChild.rows[0].cells[0].width = 100 + "%";
                this.projectItem[0].firstChild.rows[0].cells[0].firstChild.style.width = this.Duration * this.Chart.hourInPixelsWork + "px"
            }
        }else if (((percentCompleted == 0)|| (percentCompleted == 100)) && ((this.percentCompleted == 0) || (this.percentCompleted == 100)))

        {
            if ((percentCompleted == 0)&& (this.percentCompleted == 100))

            {
                this.projectItem[0].firstChild.rows[0].cells[0].firstChild.src = this.Chart.imgs + "progress_bg.png"
            }else if ((percentCompleted == 100)&& (this.percentCompleted == 0))

            {
                this.projectItem[0].firstChild.rows[0].cells[0].firstChild.src = this.Chart.imgs + "parentnode_filled.png"
            }
        }else if (((percentCompleted > 0)|| (percentCompleted < 100)) && ((this.percentCompleted == 0) || (this.percentCompleted == 100)))
        {
            this.projectItem[0].firstChild.rows[0].cells[0].parentNode.removeChild(this.projectItem[0].firstChild.rows[0].cells[0]);
            var cellprojectItem = document.createElement("TD");
            this.projectItem[0].firstChild.rows[0].appendChild(cellprojectItem);
            cellprojectItem.width = percentCompleted + "%";
            var imgPr = document.createElement("img");
            imgPr.style.width = (percentCompleted * this.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
            imgPr.style.height = this.Chart.heightTaskItem + "px";
            cellprojectItem.appendChild(imgPr);
            imgPr.src = this.Chart.imgs + "parentnode_filled.png";
            cellprojectItem = document.createElement("TD");
            this.projectItem[0].firstChild.rows[0].appendChild(cellprojectItem);
            cellprojectItem.width = (100 - percentCompleted) + "%";
            imgPr = document.createElement("img");
            imgPr.style.width = ((100 - percentCompleted) * this.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
            imgPr.style.height = this.Chart.heightTaskItem + "px";
            cellprojectItem.appendChild(imgPr);
            imgPr.src = this.Chart.imgs + "progress_bg.png"
        }else if (this.percentCompleted == -1){
            if (percentCompleted == 100){
                this.projectItem[0].firstChild.rows[0].cells[0].firstChild.src = this.Chart.imgs + "parentnode_filled.png"
            }else if (percentCompleted < 100 && percentCompleted > 0){
                this.projectItem[0].firstChild.rows[0].cells[0].parentNode.removeChild(this.projectItem[0].firstChild.rows[0].cells[0]);
                var cellprojectItem = document.createElement("TD");
                this.projectItem[0].firstChild.rows[0].appendChild(cellprojectItem);
                cellprojectItem.width = percentCompleted + "%";
                var imgPr = document.createElement("img");
                imgPr.style.width = (percentCompleted * this.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
                imgPr.style.height = this.Chart.heightTaskItem + "px";
                cellprojectItem.appendChild(imgPr);
                imgPr.src = this.Chart.imgs + "parentnode_filled.png";
                cellprojectItem = document.createElement("TD");
                this.projectItem[0].firstChild.rows[0].appendChild(cellprojectItem);
                cellprojectItem.width = (100 - percentCompleted) + "%";
                imgPr = document.createElement("img");
                imgPr.style.width = ((100 - percentCompleted) * this.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
                imgPr.style.height = this.Chart.heightTaskItem + "px";
                cellprojectItem.appendChild(imgPr);
                imgPr.src = this.Chart.imgs + "progress_bg.png"
            }
        };

        this.percentCompleted = percentCompleted;
        if (this.Chart.isShowDescProject)this.descrProject.innerHTML = this.getDescStr();
        return true
    };

GanttProject.prototype.deleteChildTask = function(task)

{
        if (task){
            if (task.cTaskItem[0].style.display == "none"){
                this.Chart.openTree(task.parentTask)
            };
            
            if (task.childPredTask.length > 0){
                for (var i = 0;i < task.childPredTask.length;i++){
                    for (var t = 0;t < task.childPredTask[i].cTaskItem[1].length;t++){
                        task.childPredTask[i].cTaskItem[1][t].parentNode.removeChild(task.childPredTask[i].cTaskItem[1][t])
                    };
                    
                    task.childPredTask[i].cTaskItem[1] = [];
                    task.childPredTask[i].predTask = null
                }
            };
            
            if (task.childTask.length > 0){
                while (task.childTask.length > 0){
                    this.deleteChildTask(task.childTask[0])
                }
            };
    
            if (task.cTaskItem[0].style.display != "none")task.shiftCurrentTasks(task, -23);
            this.Project.deleteTask(task.TaskInfo.Id);
            if (task.cTaskItem[0]){
                task.cTaskItem[0].parentNode.removeChild(task.cTaskItem[0])
            };
    
            if (this.Chart.isShowDescTask){
                task.descrTask.parentNode.removeChild(task.descrTask)
            };
    
            if (task.cTaskItem[1].length > 0){
                for (var j = 0;j < task.cTaskItem[1].length;j++){
                    task.cTaskItem[1][j].parentNode.removeChild(task.cTaskItem[1][j])
                }
            };
    
            if (task.cTaskNameItem[0]){
                task.cTaskNameItem[0].parentNode.removeChild(task.cTaskNameItem[0])
            };
    
            if (task.cTaskNameItem[1]){
                for (var j = 0;j < task.cTaskNameItem[1].length;j++){
                    task.cTaskNameItem[1][j].parentNode.removeChild(task.cTaskNameItem[1][j])
                }
            };
    
            if (task.cTaskNameItem[2]){
                task.cTaskNameItem[2].parentNode.removeChild(task.cTaskNameItem[2])
            };
    
            if (task.parentTask){
                if (task.previousChildTask){
                    if (task.nextChildTask){
                        task.previousChildTask.nextChildTask = task.nextChildTask
                    }else {
                        task.previousChildTask.nextChildTask = null
                    }
                };
    
                var parentTask = task.parentTask;
                for (var i = 0;i < parentTask.childTask.length;i++){
                    if (parentTask.childTask[i].TaskInfo.Id == task.TaskInfo.Id){
                        parentTask.childTask[i] = null;
                        parentTask.childTask.splice(i, 1);
                        break
                    }
                };

                if (parentTask.childTask.length == 0){
                    if (parentTask.cTaskNameItem[2]){
                        parentTask.cTaskNameItem[2].parentNode.removeChild(parentTask.cTaskNameItem[2]);
                        parentTask.cTaskNameItem[2] = null
                    }
                }
            }else
            {
                if (task.previousParentTask){
                    if (task.nextParentTask){
                        task.previousParentTask.nextParentTask = task.nextParentTask
                    }else {
                        task.previousParentTask.nextParentTask = null
                    }
                };
    
                var project = task.Project;
                for (var i = 0;i < project.arrTasks.length;i++){
                    if (project.arrTasks[i].TaskInfo.Id == task.TaskInfo.Id){
                        project.arrTasks.splice(i, 1)
                    }
                }
            };

            if (task.predTask){
                var predTask = task.predTask;
                for (var i = 0;i < predTask.childPredTask.length;i++){
                    if (predTask.childPredTask[i].TaskInfo.Id == task.TaskInfo.Id){
                        predTask.childPredTask[i] = null;
                        predTask.childPredTask.splice(i, 1)
                    }
                }
            };

            if (task.Project.arrTasks.length != 0){
                task.Project.shiftProjectItem()
            }else {
                task.Project.projectItem[0].style.display = "none";
                if (this.Chart.isShowDescProject)this.hideDescrProject()
            };
        
            this.Chart._oDataHeight -= 11 + this.Chart.heightTaskItem
        }
    };

GanttProject.prototype.insertTask = function(id, name, EST, Duration, PercentCompleted, predecessorTaskId, parentTaskId)

{
        var task = null;
        var _task = null;
        if (this.Project.getTaskById(id)) {
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 22, [id]);
            return false
        };
        
        if ((!Duration)|| (Duration < this.Chart.minWorkLength)) {
            Duration = this.Chart.minWorkLength
        };
        
        if ((!name)|| (name == "")) {
            name = id
        };
        
        if ((!PercentCompleted)|| (PercentCompleted == "")) {
            PercentCompleted = 0
        }else {
            PercentCompleted = parseInt(PercentCompleted);
            if (PercentCompleted < 0 || PercentCompleted > 100){
                this.Chart.Error.throwError("DATA_INSERT_ERROR", 35, null);
                return false
            }
        };
    
        var sortRequired = false;
        if ((parentTaskId)&& (parentTaskId != "")) {
            var parentTask = this.Project.getTaskById(parentTaskId);
            if (!parentTask){
                this.Chart.Error.throwError("DATA_INSERT_ERROR", 21, [parentTaskId]);
                return false
            };
        
            EST = EST || parentTask.EST;
            if (EST < parentTask.EST){
                this.Chart.Error.throwError("DATA_INSERT_ERROR", 20, [id,parentTaskId]);
                return false
            };
        
            task = new GanttTaskInfo(id, name, EST, Duration, PercentCompleted, predecessorTaskId);
            if (!this.Chart.checkPosParentTask(parentTask, task)) {
                this.Chart.Error.throwError("DATA_INSERT_ERROR", 19, [parentTaskId,id]);
                return false
            };
        
            task.ParentTask = parentTask;
            var _parentTask = this.getTaskById(parentTask.Id);
            var isHide = false;
            if (_parentTask.cTaskItem[0].style.display == "none"){
                isHide = true
            }else if (_parentTask.cTaskNameItem[2]){
                if (!_parentTask._isOpen){
                    isHide = true
                }
            };
    
            if (isHide){
                if (_parentTask.childTask.length == 0){
                    this.Chart.openTree(_parentTask.parentTask)
                }else {
                    this.Chart.openTree(_parentTask)
                }
            };

            if (predecessorTaskId != ""){
                var predTask = this.Project.getTaskById(predecessorTaskId);
                if (!predTask){
                    this.Chart.Error.throwError("DATA_INSERT_ERROR", 27, [predecessorTaskId]);
                    return false
                };
        
                if (predTask.ParentTask){
                    if (predTask.ParentTask.Id != task.ParentTask.Id){
                        this.Chart.Error.throwError("DATA_INSERT_ERROR", 32, [predTask.Id,task.Id]);
                        return false
                    }
                }else {
                    this.Chart.Error.throwError("DATA_INSERT_ERROR", 32, [predTask.Id,task.Id]);
                    return false
                };
    
                if (!this.Chart.checkPosPredecessorTask(predTask, task)) {
                    this.Chart.correctPosPredecessorTask(predTask, task)
                };
    
                task.PredecessorTask = predTask
            };

            var isAdd = false;
            if (sortRequired)for (var i = 0;i < parentTask.ChildTasks.length;i++){
                if (task.EST < parentTask.ChildTasks[i].EST){
                    parentTask.ChildTasks.splice(i, 0, task);
                    if (i > 0){
                        parentTask.ChildTasks[i - 1].nextChildTask = parentTask.ChildTasks[i];
                        parentTask.ChildTasks[i].previousChildTask = parentTask.ChildTasks[i - 1]
                    };
            
                    if (parentTask.ChildTasks[i + 1]){
                        parentTask.ChildTasks[i + 1].previousChildTask = parentTask.ChildTasks[i];
                        parentTask.ChildTasks[i].nextChildTask = parentTask.ChildTasks[i + 1]
                    };
            
                    isAdd = true;
                    break
                }
            };

            if (!isAdd){
                if (parentTask.ChildTasks.length > 0){
                    parentTask.ChildTasks[parentTask.ChildTasks.length - 1].nextChildTask = task;
                    task.previousChildTask = parentTask.ChildTasks[parentTask.ChildTasks.length - 1]
                };
        
                parentTask.ChildTasks.push(task)
            };
    
            if (parentTask.ChildTasks.length == 1){
                _parentTask.cTaskNameItem[2] = _parentTask.createTreeImg()
            };
    
            _task = new GanttTask(task, this, this.Chart);
            _task.create();
            if (task.nextChildTask)_task.nextChildTask = _task.Project.getTaskById(task.nextChildTask.Id);
            _task.addDayInPanelTime();
            _task.shiftCurrentTasks(_task, 23)
        }else
        {
            EST = EST || this.Project.StartDate;
            task = new GanttTaskInfo(id, name, EST, Duration, PercentCompleted, predecessorTaskId);
            if (task.EST <= this.Chart.startDate){
                this.Chart.Error.throwError("DATA_INSERT_ERROR", 18, [task.Id]);
                return false
            };
        
            if (predecessorTaskId != ""){
                var predTask = this.Project.getTaskById(predecessorTaskId);
                if (!predTask){
                    this.Chart.Error.throwError("DATA_INSERT_ERROR", 27, [predecessorTaskId]);
                    return false
                };
            
                if (!this.Chart.checkPosPredecessorTask(predTask, task)) {
                    this.Chart.correctPosPredecessorTask(predTask, task)
                };
            
                if (predTask.ParentTask){
                    this.Chart.Error.throwError("DATA_INSERT_ERROR", 15, [task.Id,predTask.Id]);
                    return false
                };
            
                task.PredecessorTask = predTask
            };
        
            var isAdd = false;
            if (sortRequired)for (var i = 0;i < this.Project.ParentTasks.length;i++){
                if (EST < this.Project.ParentTasks[i].EST){
                    this.Project.ParentTasks.splice(i, 0, task);
                    if (i > 0){
                        this.Project.ParentTasks[i - 1].nextParentTask = task;
                        task.previousParentTask = this.Project.ParentTasks[i - 1]
                    };
                
                    if (this.Project.ParentTasks[i + 1]){
                        this.Project.ParentTasks[i + 1].previousParentTask = task;
                        task.nextParentTask = this.Project.ParentTasks[i + 1]
                    };
                
                    isAdd = true;
                    break
                }
            };
    
            if (!isAdd){
                if (this.Project.ParentTasks.length > 0){
                    this.Project.ParentTasks[this.Project.ParentTasks.length - 1].nextParentTask = task;
                    task.previousParentTask = this.Project.ParentTasks[this.Project.ParentTasks.length - 1]
                };
        
                this.Project.ParentTasks.push(task)
            };
    
            _task = new GanttTask(task, this, this.Chart);
            _task.create();
            if (task.nextParentTask)_task.nextParentTask = _task.Project.getTaskById(task.nextParentTask.Id);
            _task.addDayInPanelTime();
            this.arrTasks.push(_task);
            _task.shiftCurrentTasks(_task, 23);
            this.projectItem[0].style.display = "inline";
            this.setPercentCompleted(this.getPercentCompleted());
            this.shiftProjectItem();
            if (this.Chart.isShowDescProject){
                this.showDescrProject()
            }
        };

        this.Chart.checkHeighPanelTasks();
        return _task
    };

GanttChart.prototype.checkPosPredecessorTask = function(predTask, task)

{
        var widthPred = this.getWidthOnDuration(predTask.Duration);
        var posPred = this.getPosOnDate(predTask.EST);
        var posChild = this.getPosOnDate(task.EST);
        return (widthPred + posPred) <= posChild
    };
    
GanttChart.prototype.correctPosPredecessorTask = function(predTask, ctask, ctaskObj)

{
        var newDate = new Date(predTask.EST);
        newDate.setHours(newDate.getHours() + (predTask.Duration / this.hoursInDay * 24));
        if (newDate.getHours()> 0) {
            newDate.setHours(0);
            newDate.setDate(newDate.getDate() + 1)
        };
        
        if (ctaskObj)ctaskObj.setEST(newDate, true);else ctask.EST = newDate;
        if (ctask.ParentTask){
            if (!this.checkPosParentTask(ctask.ParentTask, ctask))

            {
                var newDate2 = new Date(ctask.ParentTask.EST);
                newDate2.setHours(newDate2.getHours() + (ctask.ParentTask.Duration / this.hoursInDay * 24));
                ctask.Duration = parseInt((parseInt((newDate2 - ctask.EST) / (1000 * 60 * 60))) * this.hoursInDay / 24)
            }
        }
    };

GanttChart.prototype.correctPosParentTask = function(parentTask, ctask)

{
        if (!ctask.PredecessorTask){
            if (parentTask.EST > ctask.EST){
                ctask.EST = new Date(parentTask.EST)
            };
            
            if (!this.checkPosParentTask(parentTask, ctask)) {
                ctask.Duration = parentTask.Duration
            }
        }else
        {
            this.correctPosPredecessorTask(ctask.PredecessorTask, ctask)
        }
    };

GanttChart.prototype.checkPosParentTaskInTree = function(parentTask)

{
        var isError = false;
        for (var t = 0;t < parentTask.ChildTasks.length;t++){
            if (!this.checkPosParentTask(parentTask, parentTask.ChildTasks[t]))

            {
                if (!this.correctError){
                    this.Error.throwError("DATA_ERROR", 28, [parentTask.Id,parentTask.ChildTasks[t].Id]);
                    return true
                }else {
                    this.correctPosParentTask(parentTask, parentTask.ChildTasks[t])
                }
            };
        
            if (parentTask.EST > parentTask.ChildTasks[t].EST){
                if (!this.correctError){
                    this.Error.throwError("DATA_ERROR", 33, [parentTask.Id,parentTask.ChildTasks[t].Id]);
                    return true
                }else {
                    this.correctPosParentTask(parentTask, parentTask.ChildTasks[t])
                }
            };
    
            if (parentTask.ChildTasks[t].ChildTasks.length > 0){
                isError = this.checkPosParentTaskInTree(parentTask.ChildTasks[t])
            }
        };

        return isError
    };

GanttChart.prototype.setPredTask = function(project)

{
        var isError = false;
        for (var k = 0;k < project.ParentTasks.length;k++){
            if (!this.isEmpty(project.ParentTasks[k].PredecessorTaskId))

            {
                project.ParentTasks[k].PredecessorTask = project.getTaskById(project.ParentTasks[k].PredecessorTaskId);
                if (!project.ParentTasks[k].PredecessorTask){
                    if (!this.correctError){
                        this.Error.throwError("DATA_ERROR", 27, [project.ParentTasks[k].PredecessorTaskId]);
                        return true
                    }
                };
            
                project.ParentTasks[k].PredecessorTask.ChildPredTasks.push(project.ParentTasks[k])
            };
        
            if (project.ParentTasks[k].PredecessorTask){
                if (!this.checkPosPredecessorTask(project.ParentTasks[k].PredecessorTask, project.ParentTasks[k])) {
                    if (!this.correctError){
                        this.Error.throwError("DATA_ERROR", 26, [project.ParentTasks[k].PredecessorTask.Id,project.ParentTasks[k].Id]);
                        return true
                    }else {
                        this.correctPosPredecessorTask(project.ParentTasks[k].PredecessorTask, project.ParentTasks[k])
                    }
                }
            };
    
            isError = this.setPredTaskInTree(project.ParentTasks[k]);
            if (isError)return isError
        };
    
        return isError
    };

GanttChart.prototype.setPredTaskInTree = function(parentTask)

{
        var isError = false;
        for (var t = 0;t < parentTask.ChildTasks.length;t++){
            if (!this.isEmpty(parentTask.ChildTasks[t].PredecessorTaskId))

            {
                parentTask.ChildTasks[t].PredecessorTask = parentTask.Project.getTaskById(parentTask.ChildTasks[t].PredecessorTaskId);
                if (!parentTask.ChildTasks[t].PredecessorTask){
                    if (!this.correctError){
                        this.Error.throwError("DATA_ERROR", 27, [parentTask.ChildTasks[t].PredecessorTaskId]);
                        return true
                    }
                };
            
                if (!this.checkPosPredecessorTask(parentTask.ChildTasks[t].PredecessorTask, parentTask.ChildTasks[t]))

                {
                    if (!this.correctError){
                        this.Error.throwError("DATA_ERROR", 26, [parentTask.ChildTasks[t].PredecessorTask.Id,parentTask.ChildTasks[t].Id]);
                        return true
                    }else {
                        this.correctPosPredecessorTask(parentTask.ChildTasks[t].PredecessorTask, parentTask.ChildTasks[t])
                    }
                };
        
                parentTask.ChildTasks[t].PredecessorTask.ChildPredTasks.push(parentTask.ChildTasks[t])
            };
        
            if (parentTask.ChildTasks[t].ChildTasks.length > 0){
                isError = this.setPredTaskInTree(parentTask.ChildTasks[t])
            }
        };

        return isError
    };

GanttChart.prototype.checkPosParentTask = function(parentTask, task)

{
        var widthParent = this.getWidthOnDuration(parentTask.Duration);
        var posParent = this.getPosOnDate(parentTask.EST);
        var posChild = this.getPosOnDate(task.EST);
        var widthChild = this.getWidthOnDuration(task.Duration);
        return (widthParent + posParent) >= (posChild + widthChild)
    };
    
GanttChart.prototype.insertProject = function(id, name, startDate)

{
        if (this._isError){
            this.clearData();
            this.clearItems();
            this.hidePanelErrors();
            this._isError = false
        };
        
        if (this.startDate >= startDate){
            this.Error.throwError("DATA_INSERT_ERROR", 14, null);
            return false
        };
        
        if (this.getProjectById(id)) {
            this.Error.throwError("DATA_INSERT_ERROR", 23, [id]);
            return false
        };
        
        this.checkHeighPanelTasks();
        var project = new GanttProjectInfo(id, name, startDate);
        this.Project.push(project);
        var _project = new GanttProject(this, project);
        for (var i = 0;i < this.arrProjects.length;i++){
            if (startDate < this.arrProjects[i].Project.StartDate){
                this.arrProjects.splice(i, 0, _project);
                if (i > 0){
                    _project.previousProject = this.arrProjects[i - 1];
                    this.arrProjects[i - 1].nextProject = _project
                };
                
                if (i + 1 <= this.arrProjects.length){
                    _project.nextProject = this.arrProjects[i + 1];
                    this.arrProjects[i + 1].previousProject = _project;
                    _project.shiftNextProject(_project, 23)
                };
                
                _project.create();
                if (this.isShowDescProject){
                    _project.hideDescrProject()
                };
                
                return _project
            }
        };
    
        if (this.arrProjects.length > 0){
            this.arrProjects[this.arrProjects.length - 1].nextProject = _project;
            _project.previousProject = this.arrProjects[this.arrProjects.length - 1]
        };
    
        this.arrProjects.push(_project);
        _project.create();
        if (this.isShowDescProject){
            _project.hideDescrProject()
        };
    
        return _project
    };

GanttChart.prototype._showContextMenu = function(event, obj)

{
        if (this.contextMenu.isDhtmlxMenuObject){
            var res = this.callEvent("onBeforeContextMenu", [this.contextMenu, obj]);
            if (res === false)return;
            var x, y;
            if (_isIE){
                var dEl0 = window.document.documentElement, dEl1 = window.document.body, corrector = new Array((dEl0.scrollLeft||dEl1.scrollLeft),(dEl0.scrollTop||dEl1.scrollTop));
                x = event.clientX + corrector[0];
                y = event.clientY + corrector[1]
            }else {
                x = event.pageX;
                y = event.pageY
            };
            
            this.contextMenu.showContextMenu(x-1, y-1)
        }else {
            var elem = event.srcElement || event.target;
            this.contextMenu.showContextMenu(elem.style.left, elem.style.top, obj)
        }
    };

GanttChart.prototype.openTree = function(parentTask)

{
        var lastParentTask = this.getLastCloseParent(parentTask);
        if (parentTask.TaskInfo.Id != lastParentTask.TaskInfo.Id){
            this.openNode(lastParentTask);
            this.openTree(parentTask)
        }else {
            this.openNode(lastParentTask)
        }
    };

GanttChart.prototype.openNode = function(parentTask)

{
        if (!parentTask._isOpen){
            parentTask.cTaskNameItem[2].src = this.imgs + "minus.gif";
            parentTask._isOpen = true;
            parentTask.shiftCurrentTasks(parentTask, parentTask._heightHideTasks);
            parentTask.showChildTasks(parentTask, parentTask._isOpen);
            parentTask._heightHideTasks = 0
        }
    };

GanttChart.prototype.getLastCloseParent = function(task)

{
        if (task.parentTask){
            if ((!task.parentTask._isOpen)||
                (task.parentTask.cTaskNameItem[2].style.display == "none")) {
                return this.getLastCloseParent(task.parentTask)
            }else {
                return task
            }
        }else {
            return task
        }
    };

GanttTask.prototype.setPredecessor = function(predecessorTaskId)

{
        if (predecessorTaskId == "")this.clearPredTask();
        else

        {
            var task = this.TaskInfo;
            if (task.Id == predecessorTaskId){
                this.Chart.Error.throwError("DATA_INSERT_ERROR", 36);
                return false
            };
            
            var predTaskObj = this.Project.getTaskById(predecessorTaskId);
            if (!predTaskObj){
                this.Chart.Error.throwError("DATA_INSERT_ERROR", 27, [predecessorTaskId]);
                return false
            };
            
            var predTask = predTaskObj.TaskInfo;
            var a1 = predTask.ParentTask == null, a2 = task.ParentTask == null;
            if (a1 && !a2 || !a1 && a2 || !a1 && !a2 && (predTask.ParentTask.Id != task.ParentTask.Id)) {
                this.Chart.Error.throwError("DATA_INSERT_ERROR", 32, [predTask.Id,task.Id]);
                return false
            };
            
            this.clearPredTask();
            if (!this.Chart.checkPosPredecessorTask(predTask, task)) {
                this.Chart.correctPosPredecessorTask(predTask, task, this)
            };
            
            task.PredecessorTaskId = predecessorTaskId;
            task.PredecessorTask = predTask;
            this.predTask = predTaskObj;
            predTaskObj.childPredTask.push(this);
            this.cTaskItem[1] = this.createConnectingLinesDS()
        };
        
        return true
    };
    
GanttTask.prototype.clearPredTask = function() {
    if (this.predTask){
        var ch = this.predTask.childPredTask;
        for (var i = 0;i < ch.length;i++){
            if (ch[i] == this){
                ch.splice(i, 1);
                break
            }
        };
        
        for (var i = 0;i < this.cTaskItem[1].length;i++){
            this.cTaskItem[1][i].parentNode.removeChild(this.cTaskItem[1][i])
        };
        
        this.cTaskItem[1] = [];
        this.TaskInfo.PredecessorTaskId = null;
        this.TaskInfo.PredecessorTask = null;
        this.predTask = null
    }
};

GanttTask.prototype.setEST = function(est, shiftChild)

{
        this.moveChild = shiftChild;
        this.getMoveInfo();
        var pos = this.Chart.getPosOnDate(est);
        if ((parseInt(this.cTaskItem[0].firstChild.firstChild.width)+ pos > this.maxPosXMove) && (this.maxPosXMove != -1))

        {
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 12, [this.TaskInfo.Id]);
            this.maxPosXMove = -1;
            this.minPosXMove = -1;
            return false
        };
        
        if (pos < this.minPosXMove){
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 11, [this.TaskInfo.Id]);
            this.maxPosXMove = -1;
            this.minPosXMove = -1;
            return false
        };
        
        this.cTaskItem[0].style.left = pos;
        var width = pos - this.posX;
        this.moveCurrentTaskItem(width, shiftChild);
        this.Project.shiftProjectItem();
        if (this.Chart.isShowDescTask)this.descrTask.innerHTML = this.getDescStr();
        this.addDayInPanelTime();
        this.posX = 0;
        this.maxPosXMove = -1;
        this.minPosXMove = -1;
        return true
    };
    
GanttTask.prototype.setDuration = function(duration)

{
        this.getResizeInfo();
        var width = this.Chart.getWidthOnDuration(duration);
        if ((width > this.maxWidthResize)&& (this.maxWidthResize != -1))

        {
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 10, [this.TaskInfo.Id]);
            return false
        }else if (width < this.minWidthResize){
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 9, [this.TaskInfo.Id]);
            return false
        }else {
            this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width);
            this.resizeTaskItem(width);
            this.endResizeItem();
            if (this.Chart.isShowDescTask)this.descrTask.innerHTML = this.getDescStr();
            return true
        }
    };

GanttTask.prototype.setPercentCompleted = function(percentCompleted)

{
        percentCompleted = parseInt(percentCompleted);
        if (isNaN(percentCompleted))

        {
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 6, null);
            return false
        };
        
        if (percentCompleted > 100){
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 7, null);
            return false
        };
        
        if (percentCompleted < 0){
            this.Chart.Error.throwError("DATA_INSERT_ERROR", 8, null);
            return false
        };
        
        if ((percentCompleted != 0)&& (percentCompleted != 100))

        {
            if ((this.TaskInfo.PercentCompleted != 0)&& (this.TaskInfo.PercentCompleted != 100))

            {
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0].width = percentCompleted + "%";
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[1].width = 100 - percentCompleted + "%"
            }else if ((this.TaskInfo.PercentCompleted == 0)|| (this.TaskInfo.PercentCompleted == 100))

            {
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0].parentNode.removeChild(this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0]);
                var cellTblTask = document.createElement("td");
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].appendChild(cellTblTask);
                cellTblTask.height = this.Chart.heightTaskItem + "px";
                cellTblTask.width = percentCompleted + "%";
                var imgPrF = document.createElement("img");
                imgPrF.style.width = (percentCompleted * this.TaskInfo.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
                imgPrF.style.height = this.Chart.heightTaskItem + "px";
                cellTblTask.appendChild(imgPrF);
                imgPrF.src = this.Chart.imgs + "progress_filled.png";
                cellTblTask = document.createElement("td");
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].appendChild(cellTblTask);
                cellTblTask.height = this.Chart.heightTaskItem + "px";
                cellTblTask.width = (100 - percentCompleted) + "%";
                imgPrF = document.createElement("img");
                imgPrF.style.width = ((100 - percentCompleted) * this.TaskInfo.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
                imgPrF.style.height = this.Chart.heightTaskItem + "px";
                cellTblTask.appendChild(imgPrF);
                imgPrF.src = this.Chart.imgs + "progress_bg.png"
            }
        }else if (percentCompleted == 0){
            if ((this.TaskInfo.PercentCompleted != 0)&& (this.TaskInfo.PercentCompleted != 100))

            {
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0].parentNode.removeChild(this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0]);
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0].width = 100 + "%"
            }else

            {
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0].firstChild.src = this.Chart.imgs + "progress_bg.png"
            }
        }else if (percentCompleted == 100){
            if ((this.TaskInfo.PercentCompleted != 0)&& (this.TaskInfo.PercentCompleted != 100))

            {
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[1].parentNode.removeChild(this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[1]);
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0].width = 100 + "%"
            }else

            {
                this.cTaskItem[0].childNodes[0].firstChild.rows[0].cells[0].firstChild.src = this.Chart.imgs + "progress_filled.png"
            }
        };

        this.TaskInfo.PercentCompleted = percentCompleted;
        this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width);
        this.resizeTaskItem(this.taskItemWidth);
        this.endResizeItem();
        if (this.Chart.isShowDescTask)this.descrTask.innerHTML = this.getDescStr();
        return true
    };

GanttTask.prototype.setName = function(name)

{
        if ((name != "")&& (name != null)) {
            this.TaskInfo.Name = name;
            if (this.Chart._showTreePanel){
                this.cTaskNameItem[0].innerHTML = name;
                this.cTaskNameItem[0].title = name;
                this.checkWidthTaskNameItem()
            };
            
            if (this.Chart.isShowDescTask)this.descrTask.innerHTML = this.getDescStr();
            this.addDayInPanelTime()
        }
    };

GanttChart.prototype.getProjectInfoById = function(id)

{
        for (var i = 0;i < this.Project.length;i++){
            if (this.Project[i].Id == id){
                return this.Project[i]
            }
        };
    
        return null
    };

GanttChart.prototype.loadData = function(content, isFile, isLocal)

{
        this.clearData();
        if ((isFile == null)|| (isFile == 'undefined'))

        {
            isFile = false
        };
        
        if ((isLocal == null)|| (isLocal == 'undefined'))

        {
            isLocal = false
        };
        
        this.loadXML(content, isFile, isLocal);
        this.Project.sort(this.sort_byStartDate);
        this.startDate = this.getStartDate();
        this.clearItems();
        for (var i = 0;i < this.Project.length;i++){
            for (var k = 0;k < this.Project[i].ParentTasks.length;k++){
                if ((this.Project[i].ParentTasks[k].EST != null)&& (this.Project[i].ParentTasks[k].EST != '')) {
                    this.setESTChild(this.Project[i].ParentTasks[k])
                }else {
                    this.Error.throwError("DATA_ERROR", 25, [this.Project[i].ParentTasks[k].Id]);
                    return
                };
            
                if (this.setPredTask(this.Project[i])) return
            };
        
            for (var k = 0;k < this.Project[i].ParentTasks.length;k++){
                if (this.Project[i].ParentTasks[k].EST < this.Project[i].StartDate){
                    this.Error.throwError("DATA_ERROR", 24, [this.Project[i].ParentTasks[k].Id,this.Project[i].Id]);
                    return
                };
            
                if (this.checkPosParentTaskInTree(this.Project[i].ParentTasks[k])) return
            };
        
            this.sortTasksByEST(this.Project[i])
        };
        
        for (var i = 0;i < this.Project.length;i++){
            var project = new GanttProject(this, this.Project[i]);
            if (this.arrProjects.length > 0){
                var previousProject = this.arrProjects[this.arrProjects.length - 1];
                project.previousProject = previousProject;
                previousProject.nextProject = project
            };
            
            project.create();
            this.checkHeighPanelTasks();
            this.arrProjects.push(project);
            this.createTasks(project)
        }
    };
    
GanttChart.prototype.clearAll = function()

{
        this._oDataHeight = 0;
        this.startDate = null;
        this._isError = false;
        this.hidePanelErrors();
        this.clearData();
        this.clearItems()
    };
    
GanttChart.prototype.clearData = function()

{
        this._oDataHeight = 0;
        this.startDate = null;
        this._isError = false;
        this.hidePanelErrors();
        this.Project = [];
        this.arrProjects = []
    };
    
GanttChart.prototype.clearItems = function()

{
        this.oData.removeChild(this.oData.firstChild);
        this.oData.appendChild(this.createPanelTasks());
        this.oData.firstChild.appendChild(this.divInfo);
        this.oData.firstChild.appendChild(this.panelErrors);
        if (this._showTreePanel){
            this.panelNames.removeChild(this.panelNames.firstChild);
            this.panelNames.appendChild(this.createPanelNamesTasks())
        };
        
        this.panelTime.removeChild(this.panelTime.firstChild);
        this.panelTime.appendChild(this.createPanelTime())
    };
    
GanttChart.prototype.loadXML = function(content, isFile, isLocal)

{
        if (isFile && (content == null || content == ""))

        {
            this.Error.throwError("DATA_SEND_ERROR", 4, null);
            return
        };
    
        this.xmlLoader = new dtmlXMLLoaderObject(null, this, false);
        try

        {
            if (!isFile)try {
                this.xmlLoader.loadXMLString(content)
            }catch(e) {
                this.Error.throwError("DATA_LOAD_ERROR", 37, [content])
            }else
            if (!isLocal){
                this.xmlLoader.loadXML(this.loadPath + "?path=" + content + "&rnd=" + (new Date() - 0), false)
            }else

            {
                this.xmlLoader.loadXML(content + "?rnd=" + (new Date() - 0), false)
            };
            
            this.doLoadDetails(isLocal)
        }catch(e)

        {
            this.Error.throwError("DATA_LOAD_ERROR", 5, [content])
        }
    };

GanttChart.prototype.doLoadDetails = function(isLocal)

{
        switch (this.xmlLoader.xmlDoc.status) {
            case 0:
                if (!isLocal){
                    this.Error.throwError("DATA_LOAD_ERROR", 1, null);
                    return
                };
            
                break;
            case 404:
                if (!isLocal){
                    this.Error.throwError("DATA_LOAD_ERROR", 5, [this.loadPath])
                }else

                {
                    this.Error.throwError("DATA_LOAD_ERROR", 5, [this.xmlLoader.filePath])
                };
            
                return;
                break;
            case 500:
                this.Error.throwError("DATA_LOAD_ERROR", 2, null);
                return;
                break;
            default:
                break
        };
            
        var name = null;
        var id = null;
        var est = null;
        var duration = null;
        var percentCompleted = null;
        var predecessorTaskId = null;
        var projectArr = this.xmlLoader.doXPath("//project");
        for (var j = 0;j < projectArr.length;j++){
            var startDateTemp = projectArr[j].getAttribute("startdate");
            var startDate = startDateTemp.split(",");
            var project = new GanttProjectInfo(projectArr[j].getAttribute("id"), projectArr[j].getAttribute("name"), new Date(startDate[0], (parseInt(startDate[1]) - 1), startDate[2]));
            var taskArr = this.xmlLoader.doXPath("./task", projectArr[j]);
            for (var i = 0;i < taskArr.length;i++){
                id = taskArr[i].getAttribute("id");
                name = (this.xmlLoader.doXPath("./name", taskArr[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./name", taskArr[i])[0].firstChild.nodeValue;
                var estTemp = (this.xmlLoader.doXPath("./est", taskArr[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./est", taskArr[i])[0].firstChild.nodeValue;
                est = estTemp.split(",");
                duration = (this.xmlLoader.doXPath("./duration", taskArr[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./duration", taskArr[i])[0].firstChild.nodeValue;
                percentCompleted = (this.xmlLoader.doXPath("./percentcompleted", taskArr[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./percentcompleted", taskArr[i])[0].firstChild.nodeValue;
                predecessorTaskId = (this.xmlLoader.doXPath("./predecessortasks", taskArr[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./predecessortasks", taskArr[i])[0].firstChild.nodeValue;
                var task = new GanttTaskInfo(id, name, new Date(est[0], (parseInt(est[1]) - 1), est[2]), duration, percentCompleted, predecessorTaskId);
                var childTasksNode = this.xmlLoader.doXPath("./childtasks", taskArr[i]);
                var childTasksArr = this.xmlLoader.doXPath("./task", childTasksNode[0]);
                if (childTasksArr.length != 0)this.readChildTasksXML(task, childTasksArr);
                project.addTask(task)
            };
            
            this.addProject(project)
        }
    };
    
GanttChart.prototype.readChildTasksXML = function(parentTask, childTasksArrXML)

{
        var name = null;
        var id = null;
        var est = null;
        var duration = null;
        var percentCompleted = null;
        var predecessorTaskId = null;
        for (var i = 0;i < childTasksArrXML.length;i ++){
            id = childTasksArrXML[i].getAttribute("id");
            name = (this.xmlLoader.doXPath("./name", childTasksArrXML[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./name", childTasksArrXML[i])[0].firstChild.nodeValue;
            var estTemp = (this.xmlLoader.doXPath("./est", childTasksArrXML[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./est", childTasksArrXML[i])[0].firstChild.nodeValue;
            est = estTemp.split(",");
            duration = (this.xmlLoader.doXPath("./duration", childTasksArrXML[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./duration", childTasksArrXML[i])[0].firstChild.nodeValue;
            percentCompleted = (this.xmlLoader.doXPath("./percentcompleted", childTasksArrXML[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./percentcompleted", childTasksArrXML[i])[0].firstChild.nodeValue;
            predecessorTaskId = (this.xmlLoader.doXPath("./predecessortasks", childTasksArrXML[i])[0].firstChild == null) ? "" : this.xmlLoader.doXPath("./predecessortasks", childTasksArrXML[i])[0].firstChild.nodeValue;
            var task = new GanttTaskInfo(id, name, new Date(est[0], (parseInt(est[1]) - 1), est[2]), duration, percentCompleted, predecessorTaskId);
            task.ParentTask = parentTask;
            parentTask.addChildTask(task);
            var childTasksNode = this.xmlLoader.doXPath("./childtasks", childTasksArrXML[i]);
            var childTasksArr = this.xmlLoader.doXPath("./task", childTasksNode[0]);
            if (childTasksArr.length != 0){
                this.readChildTasksXML(task, childTasksArr)
            }
        }
    };

GanttChart.prototype.getXML = function()

{
        var strXML = "<projects>";
        for (var i = 0;i < this.Project.length;i++){
            strXML += "<project id ='" + this.Project[i].Id + "' name= '" + this.Project[i].Name + "' startdate = '" + this.Project[i].StartDate.getFullYear() + "," + (this.Project[i].StartDate.getMonth() + 1) + "," + this.Project[i].StartDate.getDate() + "'>";
            for (var j = 0;j < this.Project[i].ParentTasks.length;j++){
                strXML += "<task id ='" + this.Project[i].ParentTasks[j].Id + "'>";
                strXML += "<name>" + this.Project[i].ParentTasks[j].Name + "</name>";
                strXML += "<est>" + this.Project[i].ParentTasks[j].EST.getFullYear() + "," + (this.Project[i].ParentTasks[j].EST.getMonth() + 1) + "," + this.Project[i].ParentTasks[j].EST.getDate() + "</est>";
                strXML += "<duration>" + this.Project[i].ParentTasks[j].Duration + "</duration>";
                strXML += "<percentcompleted>" + this.Project[i].ParentTasks[j].PercentCompleted + "</percentcompleted>";
                strXML += "<predecessortasks>" + this.Project[i].ParentTasks[j].PredecessorTaskId + "</predecessortasks>";
                strXML += "<childtasks>";
                strXML += this.createChildTasksXML(this.Project[i].ParentTasks[j].ChildTasks);
                strXML += "</childtasks>";
                strXML += "</task>"
            };
            
            strXML += "</project>"
        };
        
        strXML += "</projects>";
        return strXML
    };
    
GanttChart.prototype.createChildTasksXML = function(childTasks)

{
        var strXML = "";
        for (var n = 0;n < childTasks.length;n++){
            strXML += "<task id='" + childTasks[n].Id + "'>";
            strXML += "<name>" + childTasks[n].Name + "</name>";
            strXML += "<est>" + childTasks[n].EST.getFullYear() + "," + (childTasks[n].EST.getMonth() + 1) + "," + childTasks[n].EST.getDate() + "</est>";
            strXML += "<duration>" + childTasks[n].Duration + "</duration>";
            strXML += "<percentcompleted>" + childTasks[n].PercentCompleted + "</percentcompleted>";
            strXML += "<predecessortasks>" + childTasks[n].PredecessorTaskId + "</predecessortasks>";
            if (childTasks[n].ChildTasks){
                strXML += "<childtasks>";
                strXML += this.createChildTasksXML(childTasks[n].ChildTasks);
                strXML += "</childtasks>"
            };
            
            strXML += "</task>"
        };
        
        return strXML
    };
    
GanttChart.prototype.sort_byEST = function(a, b)

{
        if (a.EST < b.EST)return -1;
        if (a.EST > b.EST)return 1;
        return 0
    };
    
GanttChart.prototype.sort_byStartDate = function(a, b)

{
        if (a["StartDate"] < b["StartDate"])return -1;
        if (a["StartDate"] > b["StartDate"])return 1;
        return 0
    };
    
GanttChart.prototype.setESTChild = function(parentTask)

{
        for (var t = 0;t < parentTask.ChildTasks.length;t++){
            if ((parentTask.ChildTasks[t].EST == null )|| (parentTask.ChildTasks[t].EST == ""))

            {
                parentTask.ChildTasks[t].EST = parentTask.EST
            };
            
            if (parentTask.ChildTasks[t].ChildTasks.length != 0)this.setESTChild(parentTask.ChildTasks[t])
        }
    };
    
GanttChart.prototype.createPanelTasks = function()

{
        var divTasks = document.createElement("div");
        divTasks.className = "taskPanel";
        divTasks.style.cssText = "position:relative;";
        divTasks.style.height = this.contentHeight - 63 + "px";
        var w = this.startDate ? (this.startDate.getDay()-1) : ((new Date(0)).getDay()-1);
        if (w==-1)w=6;
        divTasks.style.background = "url(" + this.imgs + "bg_week.png) -"+(w*24)+"px 0px";
        this.panelTasks = divTasks;
        return divTasks
    };
    
GanttChart.prototype.createPanelNamesTasks = function()

{
        var divListNames = document.createElement("div");
        divListNames.innerHTML = "&nbsp;";
        divListNames.style.cssText = "position:relative;background:url(" + this.imgs + "bg.png)";
        divListNames.style.height = this.contentHeight - 63 + "px";
        divListNames.style.width = this.maxWidthPanelNames + "px";
        return divListNames
    };
    
GanttChart.prototype.createPopUpInfo = function()

{
        var divTaskInfo = document.createElement("div");
        divTaskInfo.style.cssText = 'display: none;';
        var tblTaskInfo = document.createElement("table");
        tblTaskInfo.style.cssText = "position:absolute;top:0px;left:0px";
        tblTaskInfo.className = "poPupInfo";
        divTaskInfo.appendChild(tblTaskInfo);
        var rowTaskInfo = tblTaskInfo.insertRow(tblTaskInfo.rows.length);
        var cellTaskInfo = document.createElement("td");
        rowTaskInfo.appendChild(cellTaskInfo);
        this.divInfo = divTaskInfo;
        return divTaskInfo
    };
    
GanttChart.prototype.createPopUpTimeInfo = function()

{
        var divTimeInfo = document.createElement("div");
        divTimeInfo.style.display = "none";
        var tblTimeInfo = document.createElement("table");
        tblTimeInfo.className = "poPupTime";
        divTimeInfo.appendChild(tblTimeInfo);
        var rowTimeInfo = tblTimeInfo.insertRow(tblTimeInfo.rows.length);
        var cellTimeInfo = document.createElement("td");
        cellTimeInfo.align = "center";
        rowTimeInfo.appendChild(cellTimeInfo);
        return divTimeInfo
    };
    
GanttChart.prototype.createPanelTime = function()

{
        var panelTime = document.createElement("div");
        panelTime.style.position = "relative";
        var tblTime = document.createElement("table");
        panelTime.appendChild(tblTime);
        tblTime.cellPadding = "0px";
        tblTime.border = "0px";
        tblTime.cellSpacing = "0px";
        tblTime.bgColor = "#FFFFFF";
        tblTime.style.marginTop = "0px";
        var monthRow = tblTime.insertRow(tblTime.rows.length);
        var newRow = tblTime.insertRow(tblTime.rows.length);
        for (var i = 0;i < this.countDays;i++){
            this.addPointInTimePanel(newRow, panelTime);
            this.addDayInPanelTime(newRow)
        };
        
        return panelTime
    };
    
GanttChart.prototype.addPointInTimePanel = function(row, panelTime)

{
        var leftLine = document.createElement("div");
        leftLine.style.cssText = "position:absolute;left:" + ( row.cells.length * this.dayInPixels ) + "px;top:20px;height:20px;width:1px;font-size:1px;margin-left:0px;margin-right:0px;margin-top:0px;margin-bottom:0px;background:#f1f3f1;";
        panelTime.appendChild(leftLine)
    };
    
GanttChart.prototype._calculateMonthColSpan = function(date, maxLen) {
    var m1 = date.getMonth();
    for(var i=1;i<=maxLen;i++){
        date.setDate(date.getDate() + 1);
        var m2 = date.getMonth();
        if (m2 != m1)return i
    };
            
    return maxLen
};
    
GanttChart.prototype.getMonthScaleLabel = function(date) {
    return (this._useShortMonthNames ? this.shortMonthNames : this.monthNames)[date.getMonth()] + " '" + (""+date.getFullYear()).substring(2)
};
    
GanttChart.prototype.useShortMonthNames = function(flag) {
    this._useShortMonthNames = flag
};
    
GanttChart.prototype.setShortMonthNames = function(names) {
    this.shortMonthNames = names
};
    
GanttChart.prototype.setMonthNames = function(names) {
    this.monthNames = names
};
    
GanttChart.prototype.addDayInPanelTime = function(row)

{
        var self = this, idx = row.cells.length, date = new Date(this.startDate);
        var newCell = row.insertCell(idx);
        newCell.style.height = "20px";
        newCell.style.width = this.dayInPixels + "px";
        newCell.className = "dayNumber";
        date.setDate(date.getDate() + parseInt(idx));
        var day = date.getDate()
        newCell.innerHTML = day;
        newCell.setAttribute("idx", idx);
        var monthRow = row.parentNode.parentNode.rows[0];
        if (idx==0 || day==1){
            var newCell2 = monthRow.insertCell(monthRow.cells.length);
            newCell2.className = "monthName";
            newCell2.style.height = "20px";
            if (monthRow.cells.length%2 == 0)newCell2.style.backgroundColor = "#f7f8f7";
            newCell2.colSpan = this._calculateMonthColSpan(new Date(date), Math.max(1,this.countDays-idx));
            newCell2.innerHTML = this.getMonthScaleLabel(date)
        }else {
            var n = monthRow.cells.length, cs=0;
            for(var i=0;i<n;i++){
                cs += monthRow.cells[i].colSpan
            };
            
            if (idx>=cs)monthRow.cells[n-1].colSpan += 1
        };
            
        var w = date.getDay();
        if (w==0 || w==6)newCell.style.backgroundColor = "#f7f8f7"
    };
        
GanttChart.prototype.incHeightPanelTasks = function(height)

{
        var containerTasks = this.oData.firstChild;
        containerTasks.style.height = parseInt(containerTasks.style.height) + height + "px"
    };
    
GanttChart.prototype.incHeightPanelNames = function(height)

{
        var containerNames = this.panelNames.firstChild;
        containerNames.style.height = parseInt(containerNames.style.height) + height + "px"
    };
    
GanttChart.prototype.checkHeighPanelTasks = function()

{
        this._oDataHeight += 11 + this.heightTaskItem;
        if ((parseInt(this.oData.firstChild.style.height)<= this._oDataHeight)) {
            this.incHeightPanelTasks(this.heightTaskItem + 11);
            if (this._showTreePanel)this.incHeightPanelNames(this.heightTaskItem + 11)
        }
    };

GanttChart.prototype.sortTasksByEST = function(project)

{
        project.ParentTasks.sort(this.sort_byEST);
        for (var i = 0;i < project.ParentTasks.length;i++){
            project.ParentTasks[i] = this.sortChildTasks(project.ParentTasks[i])
        }
    };
    
GanttChart.prototype.sortChildTasks = function(parenttask)

{
        parenttask.ChildTasks.sort(this.sort_byEST);
        for (var i = 0;i < parenttask.ChildTasks.length;i++){
            if (parenttask.ChildTasks[i].ChildTasks.length > 0)this.sortChildTasks(parenttask.ChildTasks[i])
        };
            
        return parenttask
    };
    
GanttChart.prototype.errorDataHandler = function(type, descr, params)

{
        if (!this._isError){
            this.clearData();
            this.showPanelErrors();
            this._isError = true
        };
        
        this.addErrorInPanelErrors(type, descr)
    };
    
GanttChart.prototype.createPanelErrors = function()

{
        var tbl = document.createElement("table");
        tbl.width = "100%";
        tbl.style.display = "none";
        tbl.className = "panelErrors";
        this.panelErrors = tbl;
        return tbl
    };
    
GanttChart.prototype.showPanelErrors = function()

{
        this.panelErrors.style.display = "inline"
    };
    
GanttChart.prototype.hidePanelErrors = function()

{
        for (var i = 0;i < this.panelErrors.rows.length;i++){
            this.panelErrors.rows[i].parentNode.removeChild(this.panelErrors.rows[i])
        };
        
        this.panelErrors.style.display = "none"
    };
    
GanttChart.prototype.addErrorInPanelErrors = function(type, descr)

{
        var row = this.panelErrors.insertRow(this.panelErrors.rows.length);
        var cell = document.createElement("td");
        cell.style.height = "20px";
        cell.style.width = "100px";
        cell.innerHTML = type;
        row.appendChild(cell);
        cell = document.createElement("td");
        row.appendChild(cell);
        cell.innerHTML = descr
    };
    
GanttChart.prototype.errorSendDataHandler = function(type, descr, params)

{
        alert(descr)
    };
    
GanttChart.prototype.errorLoadDataHandler = function(type, descr, params)

{
        alert(descr)
    };
    
GanttChart.prototype.errorAPIHandler = function(type, descr, params)

{
        alert(descr)
    };
    
GanttChart.prototype.saveData = function(fileName)

{
        try {
            if (!this.dhtmlXMLSenderObject.isProcessed){
                this.dhtmlXMLSenderObject.sendData(fileName, this.savePath, this.getXML())
            }
        }catch(e) {
            this.Error.throwError("DATA_SEND_ERROR", e, null)
        }
    };

GanttChart.prototype.create = function(divId)

{
        var self = this;
        var content = document.getElementById(divId);
        this.content = content;
        this.getBrowserType();
        if (this._isIE){
            document.body.attachEvent('onselectstart', function() {
                window.event.returnValue = false
            });
            document.body.attachEvent('onkeydown', function() {
                if (event.keyCode == 65 && event.ctrlKey)window.event.returnValue = false
            })
        }else {
            content.addEventListener('mousedown', function(e) {
                e.preventDefault()
            }, true);
            document.addEventListener('keydown', function(e) {
                if (e.keyCode == 65 && e.ctrlKey)e.preventDefault()
            }, true)
        };
        
        this.Error.catchError("DATA_ERROR", function(type, descr, params) {
            self.errorDataHandler(type, descr, params)
        });
        this.Error.catchError("DATA_SEND_ERROR", function(type, descr, params) {
            self.errorSendDataHandler(type, descr, params)
        });
        this.Error.catchError("DATA_INSERT_ERROR", function(type, descr, params) {
            self.errorAPIHandler(type, descr, params)
        });
        this.Error.catchError("DATA_LOAD_ERROR", function(type, descr, params) {
            self.errorLoadDataHandler(type, descr, params)
        });
        var tableControl = document.createElement("table");
        tableControl.cellPadding = "0";
        tableControl.cellSpacing = "0";
        tableControl.style.cssText = "width: 100%;position: relative;";
        var newRowTblControl = tableControl.insertRow(tableControl.rows.length);
        var newCellTblControl;
        this.contentHeight = content.offsetHeight;
        this.contentWidth = content.offsetWidth;
        content.appendChild(tableControl);
        this.countDays = this.getCountDays();
        this.Project.sort(this.sort_byStartDate);
        this.startDate = this.getStartDate();
        this.panelTime = document.createElement("div");
        this.panelTime.appendChild(this.createPanelTime());
        this.panelTime.style.cssText = "position:relative;overflow:hidden;height:40px;top:0px;left:1px";
        this.oData = document.createElement("div");
        this.oData.appendChild(this.createPanelTasks());
        this.oData.style.cssText = "position:relative;overflow:scroll;height:" + (this.contentHeight - 40) + "px;border-left:#f1f3f1 1px solid";
        this.oData.firstChild.appendChild(this.createPanelErrors());
        if (this._showTreePanel){
            this.panelNames = document.createElement("div");
            newCellTblControl = document.createElement("td");
            newCellTblControl.vAlign = "top";
            this.panelNames.appendChild(this.createPanelNamesTasks());
            this.panelNames.style.cssText = "position:relative;top:40px;overflow:hidden;border-left:#f1f3f1 1px solid;border-bottom:#f1f3f1 1px solid";
            newCellTblControl.appendChild(this.panelNames);
            newRowTblControl.appendChild(newCellTblControl)
        };
        
        newCellTblControl = document.createElement("td");
        var divCell = document.createElement("div");
        divCell.style.cssText = "position: relative;";
        divCell.appendChild(this.panelTime);
        divCell.appendChild(this.oData);
        newCellTblControl.appendChild(divCell);
        newRowTblControl.appendChild(newCellTblControl);
        if (this._showTreePanel){
            this.panelNames.style.height = (this.contentHeight - 56) + "px";
            this.panelNames.style.width = this.maxWidthPanelNames + "px";
            this.oData.style.width = (this.contentWidth - this.maxWidthPanelNames) + "px";
            this.panelTasks.style.width = this.dayInPixels * this.countDays + "px";
            this.panelTime.style.width = (this.contentWidth - this.maxWidthPanelNames - 0*18) + "px";
            this.panelTime.firstChild.style.width = this.dayInPixels * this.countDays + "px";
            if (this.isShowConMenu && this.contextMenu == null)this.contextMenu = new contextMenu(this)
        }else {
            this.oData.style.width = this.contentWidth + "px";
            this.panelTime.style.width = (this.contentWidth - 16) + "px"
        };
        
        if (this._isOpera){
            this.oData.onmousewheel = function() {
                return false
            }
        };
    
        this.oData.onscroll = function() {
            self.panelTime.scrollLeft = this.scrollLeft;
            if (self.panelNames){
                self.panelNames.scrollTop = this.scrollTop;
                if (self.isShowConMenu)self.contextMenu.hideContextMenu()
            }
        };

        this.divTimeInfo = this.createPopUpTimeInfo();
        divCell.appendChild(this.divTimeInfo);
        this.oData.firstChild.appendChild(this.createPopUpInfo());
        for (var i = 0;i < this.Project.length;i++){
            for (var k = 0;k < this.Project[i].ParentTasks.length;k++){
                if (this.isEmpty(this.Project[i].ParentTasks[k].EST)) {
                    this.Project[i].ParentTasks[k].EST = this.Project[i].StartDate
                };
            
                this.setESTChild(this.Project[i].ParentTasks[k]);
                if (this.setPredTask(this.Project[i])) return
            };
    
            for (var k = 0;k < this.Project[i].ParentTasks.length;k++){
                if (this.Project[i].ParentTasks[k].EST < this.Project[i].StartDate){
                    if (!this.correctError){
                        this.Error.throwError("DATA_ERROR", 24, [this.Project[i].ParentTasks[k].Id,this.Project[i].Id]);
                        return
                    }else {
                        this.Project[i].ParentTasks[k].EST = this.Project[i].StartDate
                    }
                };
        
                if (this.checkPosParentTaskInTree(this.Project[i].ParentTasks[k])) return
            };
    
            this.sortTasksByEST(this.Project[i])
        };
    
        for (var i = 0;i < this.Project.length;i++){
            var project = new GanttProject(this, this.Project[i]);
            if (this.arrProjects.length > 0){
                var previousProject = this.arrProjects[this.arrProjects.length - 1];
                project.previousProject = previousProject;
                previousProject.nextProject = project
            };
        
            project.create();
            this.checkHeighPanelTasks();
            this.arrProjects.push(project);
            this.createTasks(project)
        };
    
        return this
    };

GanttChart.prototype.isEmpty = function(value)

{
        return (value == null || value == '')
    };
    
GanttChart.prototype.getPrintableHTML = function()

{
        var w = parseInt(this.oData.firstChild.style.width) - parseInt(this.oData.style.width);
        var h = parseInt(this.panelTasks.style.height) - parseInt(this.panelTasks.parentNode.style.height);
        this.oData.setAttribute("id","ganttPrint02");
        this.panelNames.setAttribute("id","ganttPrint03");
        var res = '<html><head><link type="text/css" rel="stylesheet" href="'+this.stylePath+'"><scr'+'ipt>onload=function(){var w=' + w + ',h=' + h +
        ',c1=document.getElementById("ganttPrint01"),c2=document.getElementById("ganttPrint02"),c3=document.getElementById("ganttPrint03");' +
        'c2.style.width=parseInt(c2.style.width)+w+"px";c2.previousSibling.style.width=c2.style.width;c1.style.width=parseInt(c1.style.width)+w+"px";c2.style.height=parseInt(c2.style.height)+h+"px";' +
        'c2.style.overflow="hidden";c3.style.height=c3.firstChild.style.height;c1.style.height=parseInt(c1.style.height)+h+"px"}</scr'+'ipt></head>' +
        '<body><div id="ganttPrint01" style="' + this.content.style.cssText + '">' + this.content.innerHTML + '</div></body></html>';
        this.oData.setAttribute("id",null);
        this.panelNames.setAttribute("id",null);
        return res
    };
    
GanttChart.prototype.printToWindow = function(message)

{
        var o = window.open();
        o.document.write(this.getPrintableHTML());
        o.document.close();
        if (message!==null){
            o.alert(message ? message : "Use browser's menu \"File->Print preview\" to setup page layout." )
        }
    };

GanttChart.prototype.getStartDate = function()

{
        for (var i = 0;i < this.Project.length;i++){
            if (this.startDate){
                if (this.Project[i].StartDate < this.startDate){
                    this.startDate = new Date(this.Project[i].StartDate)
                }
            }else {
                this.startDate = new Date(this.Project[i].StartDate)
            }
        };
    
        this.initialPos = 24 * this.hourInPixels;
        if (this.startDate){
            return new Date(this.startDate.setHours(this.startDate.getHours() - 24))
        }else {
            return new Date()
        }
    };

GanttChart.prototype.getCountDays = function()

{
        if (this._showTreePanel){
            return parseInt((this.contentWidth - this.maxWidthPanelNames) / (this.hourInPixels * 24))
        }else {
            return parseInt((this.contentWidth) / (this.hourInPixels * 24))
        }
    };

GanttChart.prototype.createTasks = function(project)

{
        for (var j = 0;j < project.Project.ParentTasks.length;j++){
            if (j > 0){
                project.Project.ParentTasks[j - 1].nextParentTask = project.Project.ParentTasks[j];
                project.Project.ParentTasks[j].previousParentTask = project.Project.ParentTasks[j - 1]
            };
            
            var task = new GanttTask(project.Project.ParentTasks[j], project, this);
            project.arrTasks.push(task);
            task.create();
            this.checkHeighPanelTasks();
            if (project.Project.ParentTasks[j].ChildTasks.length > 0){
                this.createChildItemControls(project.Project.ParentTasks[j].ChildTasks, project)
            }
        }
    };

GanttChart.prototype.createChildItemControls = function(arrChildTasks, project)

{
        for (var i = 0;i < arrChildTasks.length;i++){
            if (i > 0){
                arrChildTasks[i].previousChildTask = arrChildTasks[i - 1];
                arrChildTasks[i - 1].nextChildTask = arrChildTasks[i]
            };
            
            var task = new GanttTask(arrChildTasks[i], project, this);
            task.create();
            this.checkHeighPanelTasks();
            if (arrChildTasks[i].ChildTasks.length > 0){
                this.createChildItemControls(arrChildTasks[i].ChildTasks, project)
            }
        }
    };

GanttTask.prototype.getPopUpInfo = function(object, event)

{
        var posY = object.offsetTop + this.Chart.heightTaskItem + 6;
        var posX = object.offsetLeft + ((event.layerX == null) ? event.offsetX : event.layerX);
        var tblInfo = this.Chart.divInfo.lastChild;
        tblInfo.rows[0].cells[0].innerHTML = "<div style='font-family: Arial, Helvetica, Sans-serif;font-size: 12px;font-weight: bold;color: #688060;margin: 0 0 4px 0;'>" + this.TaskInfo.Name + "</div>";
        tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Inicio:&nbsp;</span><span class='ut'>" + this.TaskInfo.EST.getDate() + "/" + (this.TaskInfo.EST.getMonth() + 1) + "/" + this.TaskInfo.EST.getFullYear() + "</span><br/>";
        tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Duracao:&nbsp;</span><span class='ut'>" + this.TaskInfo.Duration + " horas </span><br/>";
        tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Porcentagem Concluida:&nbsp;</span><span class='ut'>" + this.TaskInfo.PercentCompleted + "% </span><br/>";
        if (this.predTask){
            tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Tarefa Requerida:&nbsp;</span>";
            tblInfo.rows[0].cells[0].innerHTML += "<span class='lt'>*" + this.TaskInfo.PredecessorTask.Name + "</span>"
        };
        
        if (this.TaskInfo.ChildTasks.length != 0){
            tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Tarefa Filhas:&nbsp;</span>";
            for (var i = 0;i < this.TaskInfo.ChildTasks.length;i++){
                tblInfo.rows[0].cells[0].innerHTML += (i == this.TaskInfo.ChildTasks.length - 1) ? ("<span class='lt'>*" + this.TaskInfo.ChildTasks[i].Name + "</span>") : ("<span class='lt'>*" + this.TaskInfo.ChildTasks[i].Name + "</span>")
            }
        };
        
        if (this.TaskInfo.ParentTask){
            tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Tarefa Pai:&nbsp;</span>";
            tblInfo.rows[0].cells[0].innerHTML += "<span class='lt'>*" + this.TaskInfo.ParentTask.Name + "</span>"
        };
    
        this.Chart.divInfo.style.cssText = "z-index:2;position: absolute;display: inline;";
        if (posY + this.Chart.divInfo.lastChild.offsetHeight + 10 > this.Chart.oData.offsetHeight + this.Chart.oData.scrollTop){
            this.Chart.divInfo.style.top = (posY - this.Chart.divInfo.lastChild.offsetHeight - 10 - this.Chart.heightTaskItem) + "px"
        }else {
            this.Chart.divInfo.style.top = posY + "px"
        };
    
        if (this.Chart.divInfo.lastChild.offsetWidth + posX + 10 > this.Chart.oData.offsetWidth + this.Chart.oData.scrollLeft){
            this.Chart.divInfo.style.left = posX - (this.Chart.divInfo.lastChild.offsetWidth + posX + 20 - (this.Chart.oData.offsetWidth + this.Chart.oData.scrollLeft)) + "px"
        }else {
            this.Chart.divInfo.style.left = posX + "px"
        }
    };

GanttTask.prototype.closePopUpInfo = function()

{
        this.Chart.divInfo.style.display = "none"
    };
    
GanttTask.prototype.createConnectingLinesPN = function()

{
        var arrConnectingLinesNames = [];
        return arrConnectingLinesNames
    };
    
GanttTask.prototype.createConnectingLinesDS = function()

{
        var oData = this.Chart.oData.firstChild;
        var arrLines = [];
        var arrowImg = new Image();
        arrowImg.src = this.Chart.imgs + "arr.gif";
        var lineVerticalRight = document.createElement("div");
        var lineHorizontal = document.createElement("div");
        var posXPredecessorTask = parseInt(this.predTask.cTaskItem[0].style.left);
        var posYPredecessorTask = parseInt(this.predTask.cTaskItem[0].style.top);
        var posXChildTask = parseInt(this.cTaskItem[0].style.left);
        var posYChildTask = this.posY + 2;
        var widthChildTask = parseInt(this.predTask.cTaskItem[0].firstChild.firstChild.width);
        var widthPredecessorTask = parseInt(this.predTask.cTaskItem[0].firstChild.firstChild.width);
        if (posYPredecessorTask < posYChildTask){
            lineVerticalRight.style.cssText = "border-width: 0px 0px 0px 1px;border-style: solid;border-color: #4A8F43;margin: 0px;padding: 0px;z-index:0;font-size: 1px;position: absolute;" +
            "height:" + (posYChildTask - this.Chart.heightTaskItem / 2 - posYPredecessorTask - 3) + "px;width:" + 1 + "px;left:" + (posXPredecessorTask + widthPredecessorTask - 20 ) + "px;top:" + (posYPredecessorTask + this.Chart.heightTaskItem) + "px;";
            lineHorizontal.style.cssText = "height:1px;border-color: #4A8F43;border-style: solid;border-width: 1px 0px 0px 0px;margin: 0px;padding: 0px;z-index:0;position: absolute;" +
            "width:" + (15 + (posXChildTask - (widthPredecessorTask + posXPredecessorTask))) + "px;left:" + (posXPredecessorTask + widthPredecessorTask - 20 ) + "px;top:" + (posYChildTask + 2) + "px;";
            arrowImg.style.cssText = "margin: 0px;padding: 0px;width:7px;height:14px;position: absolute;left:" + (posXChildTask - 7) + "px;top:" + (posYChildTask - 1) + "px;"
        }else {
            lineVerticalRight.style.cssText = "border-width: 0px 0px 0px 1px;border-style: solid;border-color: #4A8F43;margin: 0px;padding: 0px;z-index:0;font-size: 1px;position: absolute;" +
            "height:" + (posYPredecessorTask + 2 - posYChildTask) + "px;width:" + 1 + "px;left:" + (posXPredecessorTask + widthPredecessorTask - 20 ) + "px;top:" + (posYChildTask + 2) + "px;";
            lineHorizontal.style.cssText = "height:1px;border-color: #4A8F43;border-style: solid;border-width: 1px 0px 0px 0px;margin: 0px;padding: 0px;z-index:0;position: absolute;" +
            "width:" + (15 + (posXChildTask - (widthPredecessorTask + posXPredecessorTask))) + "px;left:" + (posXPredecessorTask + widthPredecessorTask - 20 ) + "px;top:" + (posYChildTask + 2) + "px;";
            arrowImg.style.cssText = "margin: 0px;padding: 0px;width:7px;height:14px;position: absolute;left:" + (posXChildTask - 7) + "px;top:" + (posYChildTask - 1) + "px;"
        };
        
        oData.appendChild(lineVerticalRight);
        oData.appendChild(lineHorizontal);
        oData.appendChild(arrowImg);
        arrLines.push(lineVerticalRight);
        arrLines.push(arrowImg);
        arrLines.push(lineHorizontal);
        return arrLines
    };
    
GanttTask.prototype.showChildTasks = function(task, isOpen)

{
        if (isOpen){
            for (var i = 0;i < task.childTask.length;i++){
                if (task.childTask[i].cTaskItem[0].style.display == "none"){
                    task.childTask[i].cTaskItem[0].style.display = "inline";
                    task.childTask[i].cTaskNameItem[0].style.display = "inline";
                    if (this.Chart.isShowDescTask){
                        task.childTask[i].showDescTask()
                    };
                    
                    task.isHide = false;
                    if (task.childTask[i].cTaskNameItem[2]){
                        task.childTask[i].cTaskNameItem[2].style.display = "inline";
                        isOpen = task.childTask[i]._isOpen
                    };
                    
                    for (var k = 0;k < task.childTask[i].cTaskItem[1].length;k++){
                        task.childTask[i].cTaskItem[1][k].style.display = "inline"
                    };
                    
                    for (var k = 0;k < task.childTask[i].cTaskNameItem[1].length;k++){
                        task.childTask[i].cTaskNameItem[1][k].style.display = "inline"
                    };
                    
                    this._heightHideTasks += this.Chart.heightTaskItem + 11;
                    if (task.childTask[i].childTask.length > 0){
                        this.showChildTasks(task.childTask[i], isOpen)
                    }
                }
            }
        }
    };

GanttTask.prototype.hideChildTasks = function(task)

{
        for (var i = 0;i < task.childTask.length;i++){
            if (task.childTask[i].cTaskItem[0].style.display != "none"){
                task.childTask[i].cTaskItem[0].style.display = "none";
                task.childTask[i].cTaskNameItem[0].style.display = "none";
                if (this.Chart.isShowDescTask){
                    task.childTask[i].hideDescTask()
                };
                
                task.isHide = true;
                if (task.childTask[i].cTaskNameItem[2]){
                    task.childTask[i].cTaskNameItem[2].style.display = "none"
                };
                
                for (var k = 0;k < task.childTask[i].cTaskItem[1].length;k++){
                    task.childTask[i].cTaskItem[1][k].style.display = "none"
                };
                
                for (var k = 0;k < task.childTask[i].cTaskNameItem[1].length;k++){
                    task.childTask[i].cTaskNameItem[1][k].style.display = "none"
                };
                
                this._heightHideTasks += this.Chart.heightTaskItem + 11;
                if (task.childTask[i].childTask.length > 0){
                    this.hideChildTasks(task.childTask[i])
                }
            }
        }
    };

GanttTask.prototype.shiftCurrentTasks = function(task, height)

{
        this.shiftNextTask(this, height);
        task.Project.shiftNextProject(task.Project, height)
    };
    
GanttProject.prototype.shiftNextProject = function(project, height)

{
        if (project.nextProject){
            project.nextProject.shiftProject(height);
            this.shiftNextProject(project.nextProject, height)
        }
    };

GanttProject.prototype.shiftProject = function(height)

{
        this.projectItem[0].style.top = parseInt(this.projectItem[0].style.top) + height + "px";
        if (this.Chart.isShowDescProject){
            this.descrProject.style.top = parseInt(this.descrProject.style.top) + height + "px"
        };
        
        if (this.Chart._showTreePanel){
            this.projectNameItem.style.top = parseInt(this.projectNameItem.style.top) + height + "px"
        };
        
        if (this.arrTasks.length > 0)this.shiftNextParentTask(this.arrTasks[0], height)
    };
        
GanttProject.prototype.shiftTask = function(task, height)

{
        if (this.Chart._showTreePanel){
            task.cTaskNameItem[0].style.top = parseInt(task.cTaskNameItem[0].style.top) + height + "px";
            if (task.cTaskNameItem[2]){
                task.cTaskNameItem[2].style.top = parseInt(task.cTaskNameItem[2].style.top) + height + "px"
            };
            
            if (task.parentTask && task.cTaskNameItem[1][0]){
                task.cTaskNameItem[1][0].style.top = parseInt(task.cTaskNameItem[1][0].style.top) + height + "px";
                task.cTaskNameItem[1][1].style.top = parseInt(task.cTaskNameItem[1][1].style.top) + height + "px"
            }
        };
    
        task.cTaskItem[0].style.top = parseInt(task.cTaskItem[0].style.top) + height + "px";
        if (this.Chart.isShowDescTask){
            task.descrTask.style.top = parseInt(task.descrTask.style.top) + height + "px"
        };
    
        if (task.cTaskItem[1][0]){
            task.cTaskItem[1][0].style.top = parseInt(task.cTaskItem[1][0].style.top) + height + "px";
            task.cTaskItem[1][1].style.top = parseInt(task.cTaskItem[1][1].style.top) + height + "px";
            task.cTaskItem[1][2].style.top = parseInt(task.cTaskItem[1][2].style.top) + height + "px"
        }
    };

GanttProject.prototype.shiftNextParentTask = function(task, height)

{
        this.shiftTask(task, height);
        this.shiftChildTasks(task, height);
        if (task.nextParentTask){
            this.shiftNextParentTask(task.nextParentTask, height)
        }
    };

GanttProject.prototype.shiftChildTasks = function(task, height)

{
        for (var i = 0;i < task.childTask.length;i++){
            this.shiftTask(task.childTask[i], height);
            if (task.childTask[i].childTask.length > 0){
                this.shiftChildTasks(task.childTask[i], height)
            }
        }
    };

GanttTask.prototype.shiftTask = function(task, height)

{
        if (this.Chart._showTreePanel){
            task.cTaskNameItem[0].style.top = parseInt(task.cTaskNameItem[0].style.top) + height + "px";
            if (task.cTaskNameItem[2]){
                task.cTaskNameItem[2].style.top = parseInt(task.cTaskNameItem[2].style.top) + height + "px"
            };
            
            if (task.parentTask){
                if (task.cTaskNameItem[1].length > 0)if ((parseInt(this.cTaskNameItem[0].style.top)> parseInt(task.parentTask.cTaskNameItem[0].style.top))
                    && (task.cTaskNameItem[1][0].style.display != "none")) {
                    task.cTaskNameItem[1][0].style.height = parseInt(task.cTaskNameItem[1][0].style.height) + height + "px"
                }else {
                    task.cTaskNameItem[1][0].style.top = parseInt(task.cTaskNameItem[1][0].style.top) + height + "px"
                };
                
                if (task.cTaskNameItem[1].length > 1)task.cTaskNameItem[1][1].style.top = parseInt(task.cTaskNameItem[1][1].style.top) + height + "px"
            }
        };
    
        task.cTaskItem[0].style.top = parseInt(task.cTaskItem[0].style.top) + height + "px";
        if (this.Chart.isShowDescTask){
            task.descrTask.style.top = parseInt(task.descrTask.style.top) + height + "px"
        };
    
        if (task.predTask){
            if (task.cTaskItem[1].length > 0)if (((parseInt(this.cTaskItem[0].style.top)> parseInt(task.predTask.cTaskItem[0].style.top)) ||
                (this.cTaskItem[0].id == task.predTask.TaskInfo.Id)) &&
            task.cTaskItem[1][0].style.display != "none") {
                task.cTaskItem[1][0].style.height = parseInt(task.cTaskItem[1][0].style.height) + height + "px"
            }else {
                task.cTaskItem[1][0].style.top = parseInt(task.cTaskItem[1][0].style.top) + height + "px"
            };
        
            if (task.cTaskItem[1].length > 2){
                task.cTaskItem[1][1].style.top = parseInt(task.cTaskItem[1][1].style.top) + height + "px";
                task.cTaskItem[1][2].style.top = parseInt(task.cTaskItem[1][2].style.top) + height + "px"
            }
        }
    };

GanttTask.prototype.shiftNextTask = function(task, height)

{
        if (task.nextChildTask){
            this.shiftTask(task.nextChildTask, height);
            this.shiftChildTask(task.nextChildTask, height);
            this.shiftNextTask(task.nextChildTask, height)
        }else if (task.parentTask){
            this.shiftNextTask(task.parentTask, height)
        }else if (task.nextParentTask){
            this.shiftTask(task.nextParentTask, height);
            this.shiftChildTask(task.nextParentTask, height);
            this.shiftNextTask(task.nextParentTask, height)
        }
    };

GanttTask.prototype.shiftChildTask = function(task, height)

{
        for (var i = 0;i < task.childTask.length;i++){
            this.shiftTask(task.childTask[i], height);
            if (task.childTask[i].childTask.length > 0){
                this.shiftChildTask(task.childTask[i], height)
            }
        }
    };

GanttChart.prototype.getPosOnDate = function(est)

{
        return (est - this.startDate) / (60 * 60 * 1000) * this.hourInPixels
    };
    
GanttChart.prototype.getWidthOnDuration = function(duration)

{
        return Math.round(this.hourInPixelsWork * duration)
    };
    
GanttTask.prototype.endMove = function()

{
        var width = parseInt(this.cTaskItem[0].style.left) - this.posX;
        var est = this.getDateOnPosition(parseInt(this.cTaskItem[0].style.left));
        est = this.checkPos(est);
        this.wasMoved = this.TaskInfo.EST.valueOf() != est.valueOf();
        if (this.checkMove){
            width = this.Chart.getPosOnDate(est) - this.posX;
            this.moveCurrentTaskItem(width, this.moveChild);
            this.Project.shiftProjectItem()
        };
        
        this.checkMove = false;
        this.posX = 0;
        this.maxPosXMove = -1;
        this.minPosXMove = -1;
        this.cTaskItem[0].childNodes[1].firstChild.rows[0].cells[0].innerHTML = "";
        if (this.Chart._isFF)document.body.style.cursor = "";
        if (this.Chart._isIE)this.cTaskItem[0].childNodes[2].childNodes[0].style.cursor = ""
    };
        
GanttTask.prototype.checkPos = function(est)

{
        var h = est.getHours();
        if (h >= 12){
            est.setDate(est.getDate() + 1);
            est.setHours(0);
            if ((parseInt(this.cTaskItem[0].firstChild.firstChild.width)+ this.Chart.getPosOnDate(est) > this.maxPosXMove) && (this.maxPosXMove != -1))

            {
                est.setDate(est.getDate() - 1);
                est.setHours(0)
            }
        }else if ((h < 12)&& (h != 0))

        {
            est.setHours(0);
            if ((this.Chart.getPosOnDate(est)< this.minPosXMove))

            {
                est.setDate(est.getDate() + 1)
            }
        };

        this.cTaskItem[0].style.left = this.Chart.getPosOnDate(est) + "px";
        return est
    };

GanttTask.prototype.getMaxPosPredChildTaskItem = function()

{
        var posPredChildTaskItem = 0;
        var nextPosPredChildTaskItem = 0;
        for (var i = 0;i < this.childPredTask.length;i++){
            nextPosPredChildTaskItem = this.getMaxPosPredChildTaskItemInTree(this.childPredTask[i]);
            if (nextPosPredChildTaskItem > posPredChildTaskItem){
                posPredChildTaskItem = nextPosPredChildTaskItem
            }
        };
    
        return posPredChildTaskItem
    };

GanttTask.prototype.getMaxPosPredChildTaskItemInTree = function(task)

{
        var currentPos = parseInt(task.cTaskItem[0].firstChild.firstChild.width) + parseInt(task.cTaskItem[0].style.left);
        var posPredChildTaskItem = 0;
        var nextPosPredChildTaskItem = 0;
        for (var i = 0;i < task.childPredTask.length;i++){
            nextPosPredChildTaskItem = this.getMaxPosPredChildTaskItemInTree(task.childPredTask[i]);
            if (nextPosPredChildTaskItem > posPredChildTaskItem){
                posPredChildTaskItem = nextPosPredChildTaskItem
            }
        };
    
        if (posPredChildTaskItem > currentPos){
            return posPredChildTaskItem
        }else
        {
            return currentPos
        }
    };

GanttProject.prototype.getTaskById = function(id)

{
        for (var i = 0;i < this.arrTasks.length;i++){
            var task = this.searchTaskInTree(this.arrTasks[i], id);
            if (task)return task
        };
            
        return null
    };
    
GanttProject.prototype.searchTaskInTree = function(task, id)

{
        if (task.TaskInfo.Id == id){
            return task
        }else

        {
            for (var i = 0;i < task.childTask.length;i++){
                if (task.childTask[i].TaskInfo.Id == id){
                    return task.childTask[i]
                }else

                {
                    if (task.childTask[i].childTask.length > 0){
                        var cTask = this.searchTaskInTree(task.childTask[i], id);
                        if (cTask)return cTask
                    }
                }
            }
        };

        return null
    };

GanttProject.prototype.shiftProjectItem = function()

{
        var posItemL = null;
        var posItemR = null;
        var posProjectItemL = parseInt(this.projectItem[0].style.left);
        var posProjectItemR = parseInt(this.projectItem[0].firstChild.style.width) + parseInt(this.projectItem[0].style.left);
        var widthProjectItem = parseInt(this.projectItem[0].firstChild.style.width);
        for (var t = 0;t < this.arrTasks.length;t++){
            var tmpPosItemL = parseInt(this.arrTasks[t].cTaskItem[0].style.left);
            var tmpPosItemR = parseInt(this.arrTasks[t].cTaskItem[0].style.left) + parseInt(this.arrTasks[t].cTaskItem[0].firstChild.firstChild.width);
            if (!posItemL){
                posItemL = tmpPosItemL
            };
            
            if (!posItemR){
                posItemR = tmpPosItemR
            };
            
            if (posItemL > tmpPosItemL){
                posItemL = tmpPosItemL
            };
            
            if (posItemR < tmpPosItemR){
                posItemR = tmpPosItemR
            }
        };
    
        if (posItemL != posProjectItemL){
            this.Project.StartDate = new Date(this.Chart.startDate);
            this.Project.StartDate.setHours(this.Project.StartDate.getHours() + (posItemL / this.Chart.hourInPixels))
        };
    
        this.projectItem[0].style.left = posItemL + "px";
        this.resizeProjectItem(posItemR - posItemL);
        this.Duration = Math.round(parseInt(this.projectItem[0].firstChild.width) / (this.Chart.hourInPixelsWork));
        if (this.Chart.isShowDescProject){
            this.moveDescrProject()
        };
    
        this.addDayInPanelTime()
    };
    
GanttProject.prototype.addDayInPanelTime = function()

{
        var width = parseInt(this.projectItem[0].style.left) + parseInt(this.projectItem[0].firstChild.style.width) + 20;
        if (this.Chart.isShowDescProject){
            width += this.descrProject.offsetWidth
        };
        
        var table = this.Chart.panelTime.firstChild, tbody = table.firstChild;
        if (parseInt(tbody.offsetWidth)< width)

        {
            var countDays = Math.round((width - parseInt(tbody.offsetWidth)) / this.Chart.dayInPixels);
            var row = tbody.rows[1];
            for (var n = 0;n < countDays;n++){
                this.Chart.addPointInTimePanel(row, table);
                this.Chart.addDayInPanelTime(row)
            };
            
            var w = this.Chart.dayInPixels * (row.cells.length);
            tbody.style.width = w + "px";
            this.Chart.panelTasks.style.width = (w-18) + "px"
        }
    };

GanttProject.prototype.addEvent = function (elm, evType, fn, useCapture)

{
        if (elm.addEventListener){
            elm.addEventListener(evType, fn, useCapture);
            return true
        }else if (elm.attachEvent){
            return elm.attachEvent('on' + evType, fn)
        }else {
            elm['on' + evType] = fn
        }
    };

GanttProject.prototype.getPopUpInfo = function(object, event)

{
        var posX = object.offsetLeft + ((event.layerX == null) ? event.offsetX : event.layerX);
        var posY = object.offsetTop + this.Chart.heightTaskItem + 6;
        var tblInfo = this.Chart.divInfo.lastChild;
        tblInfo.rows[0].cells[0].innerHTML = "<div style='font-family: Arial, Helvetica, Sans-serif;font-size: 12px;font-weight: bold;color: #688060;margin:0 0 4px 0;'>" + this.Project.Name + "</div>";
        tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Inicio:&nbsp;</span><span class='ut'>" + this.Project.StartDate.getDate() + "/" + (this.Project.StartDate.getMonth() + 1) + "/" + this.Project.StartDate.getFullYear() + "</span><br/>";
        tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Duracao:&nbsp;</span><span class='ut'>" + this.Duration + " horas</span><br/>";
        tblInfo.rows[0].cells[0].innerHTML += "<span class='st'>Porcentagem Concluida:&nbsp;</span><span class='ut'>" + this.percentCompleted + "%</span><br/>";
        this.Chart.divInfo.style.cssText = "z-index:2;position: absolute;display: inline;";
        if (posY + this.Chart.divInfo.lastChild.offsetHeight + 6 > this.Chart.oData.offsetHeight + this.Chart.oData.scrollTop){
            this.Chart.divInfo.style.top = (posY - this.Chart.divInfo.lastChild.offsetHeight - 10 - this.Chart.heightTaskItem) + "px"
        }else {
            this.Chart.divInfo.style.top = posY + "px"
        };
        
        if (this.Chart.divInfo.lastChild.offsetWidth + posX + 10 > this.Chart.oData.offsetWidth + this.Chart.oData.scrollLeft){
            this.Chart.divInfo.style.left = posX - (this.Chart.divInfo.lastChild.offsetWidth + posX + 20 - (this.Chart.oData.offsetWidth + this.Chart.oData.scrollLeft)) + "px"
        }else {
            this.Chart.divInfo.style.left = posX + "px"
        }
    };

GanttProject.prototype.closePopUpInfo = function()

{
        this.Chart.divInfo.style.display = "none"
    };
    
GanttProject.prototype.resizeProjectItem = function(width)

{
        var percentCompleted = this.percentCompleted;
        if (percentCompleted > 0 && percentCompleted < 100){
            this.projectItem[0].firstChild.style.width = width + "px";
            this.projectItem[0].firstChild.width = width + "px";
            this.projectItem[0].style.width = width + "px";
            this.projectItem[0].firstChild.rows[0].cells[0].firstChild.style.width = Math.round(width * percentCompleted / 100) + "px";
            this.projectItem[0].firstChild.rows[0].cells[1].firstChild.style.width = Math.round(width * (100 - percentCompleted) / 100) + "px";
            this.projectItem[0].lastChild.firstChild.width = width + "px"
        }else if (percentCompleted == 0 || percentCompleted == 100){
            this.projectItem[0].firstChild.style.width = width + "px";
            this.projectItem[0].firstChild.width = width + "px";
            this.projectItem[0].style.width = width + "px";
            this.projectItem[0].firstChild.rows[0].cells[0].firstChild.style.width = width + "px";
            this.projectItem[0].lastChild.firstChild.width = width + "px"
        }
    };

GanttTask.prototype.moveCurrentTaskItem = function(width, moveChild)

{
        var taskItem = this.cTaskItem[0];
        this.TaskInfo.EST = new Date(this.Chart.startDate);
        this.TaskInfo.EST.setHours(this.TaskInfo.EST.getHours() + (parseInt(taskItem.style.left) / this.Chart.hourInPixels));
        if (this.Chart.isShowDescTask){
            this.showDescTask()
        };
        
        if (this.cTaskItem[1].length > 0){
            this.cTaskItem[1][2].style.width = parseInt(this.cTaskItem[1][2].style.width) + width + "px";
            this.cTaskItem[1][1].style.left = parseInt(this.cTaskItem[1][1].style.left) + width + "px"
        };
        
        for (var i = 0;i < this.childTask.length;i++){
            if (!this.childTask[i].predTask){
                this.moveChildTaskItems(this.childTask[i], width, moveChild)
            }
        };
    
        for (var i = 0;i < this.childPredTask.length;i++){
            this.moveChildTaskItems(this.childPredTask[i], width, moveChild)
        }
    };

GanttTask.prototype.moveChildTaskItems = function(task, width, moveChild)

{
        var taskItem = task.cTaskItem[0];
        if (moveChild){
            taskItem.style.left = parseInt(taskItem.style.left) + width + "px";
            task.addDayInPanelTime();
            task.TaskInfo.EST = new Date(this.Chart.startDate);
            task.TaskInfo.EST.setHours(task.TaskInfo.EST.getHours() + (parseInt(taskItem.style.left) / this.Chart.hourInPixels));
            for (var n = 0;n < task.cTaskItem[1].length;n++){
                task.cTaskItem[1][n].style.left = parseInt(task.cTaskItem[1][n].style.left) + width + "px"
            };
            
            for (var i = 0;i < task.childTask.length;i++){
                if (!task.childTask[i].predTask){
                    this.moveChildTaskItems(task.childTask[i], width, moveChild)
                }
            };
        
            for (var i = 0;i < task.childPredTask.length;i++){
                this.moveChildTaskItems(task.childPredTask[i], width, moveChild)
            }
        }else
        {
            if (task.cTaskItem[1].length > 0){
                task.cTaskItem[1][2].style.left = parseInt(task.cTaskItem[1][2].style.left) + width + "px";
                task.cTaskItem[1][2].style.width = parseInt(task.cTaskItem[1][2].style.width) - width + "px";
                task.cTaskItem[1][0].style.left = parseInt(task.cTaskItem[1][0].style.left) + width + "px"
            }
        };

        if (this.Chart.isShowDescTask){
            task.moveDescTask()
        }
    };

GanttTask.prototype.addDayInPanelTime = function()

{
        var taskItem = this.cTaskItem[0];
        var width = parseInt(taskItem.style.left) + parseInt(taskItem.firstChild.firstChild.width) + 20;
        if (this.Chart.isShowDescTask){
            width += this.descrTask.offsetWidth
        };
        
        var table = this.Chart.panelTime.firstChild, tbody = table.firstChild;
        if (parseInt(tbody.offsetWidth)< width)

        {
            var row = tbody.rows[1];
            var countDays = Math.round((width + 20 - parseInt(tbody.offsetWidth)) / this.Chart.dayInPixels);
            for (var n = 0;n < countDays;n++){
                this.Chart.addPointInTimePanel(row, table);
                this.Chart.addDayInPanelTime(row)
            };
            
            var w = this.Chart.dayInPixels * (row.cells.length);
            tbody.style.width = w + "px";
            this.Chart.panelTasks.style.width = (w-18) + "px"
        }
    };

GanttTask.prototype.getDateOnPosition = function(position)

{
        var date = new Date(this.Chart.startDate);
        date.setHours(date.getHours() + (position / this.Chart.hourInPixels));
        return date
    };
    
GanttTask.prototype.moveItem = function(event)

{
        var pageX = event.screenX;
        var posTaskItem = (this.posX + (pageX - this.MouseX));
        var widthTaskItem = parseInt(this.cTaskItem[0].childNodes[0].firstChild.width);
        var posTaskItemR = posTaskItem + widthTaskItem;
        if (this.checkMove){
            var date = this.getDateOnPosition(posTaskItem);
            var res = this.Chart.callEvent("onTaskDragging", [this,date])!==false;
            if (res && ((this.minPosXMove <= posTaskItem))
                && ((posTaskItemR <= this.maxPosXMove) || (this.maxPosXMove == -1)))
                {
                this.moveTaskItem(posTaskItem)
            }
        }
    };

GanttTask.prototype.moveTaskItem = function(posX)

{
        this.addDayInPanelTime();
        this.cTaskItem[0].style.left = posX + "px";
        var date = this.getDateOnPosition(posX);
        this.cTaskItem[0].childNodes[1].firstChild.rows[0].cells[0].innerHTML = date.getDate() + '.' + (date.getMonth() + 1) + '.' + date.getUTCFullYear()
    };
    
GanttTask.prototype.resizeItem = function(event)

{
        if (this.checkResize){
            var MouseX = event.screenX;
            var widthTaskItem = this.taskItemWidth + (MouseX - this.MouseX);
            var countHours = Math.round(widthTaskItem / this.Chart.hourInPixelsWork);
            if (this.Chart.callEvent("onTaskResizing", [this,countHours])===false) return;
            if (widthTaskItem >= this.taskItemWidth){
                if ((widthTaskItem <= this.maxWidthResize)|| (this.maxWidthResize == -1))

                {
                    this.resizeTaskItem(widthTaskItem);
                    this.addDayInPanelTime()
                }else if ((this.maxWidthResize != -1)&& (widthTaskItem > this.maxWidthResize))

                {
                    this.resizeTaskItem(this.maxWidthResize)
                }
            }else if (widthTaskItem <= this.taskItemWidth){
                if (widthTaskItem >= this.minWidthResize){
                    this.resizeTaskItem(widthTaskItem)
                }else if (widthTaskItem < this.minWidthResize){
                    this.resizeTaskItem(this.minWidthResize)
                }
            }
        }
    };

GanttTask.prototype.resizeTaskItem = function(width)

{
        var taskItem = this.cTaskItem[0];
        var countHours = Math.round(width / this.Chart.hourInPixelsWork);
        var c = taskItem.childNodes[0].firstChild.rows[0].cells[0];
        if (c){
            c.firstChild.style.width = parseInt(c.width) * width / 100 + "px"
        };
        
        c = taskItem.childNodes[0].firstChild.rows[0].cells[1];
        if (c){
            c.firstChild.style.width = parseInt(c.width) * width / 100 + "px"
        };
        
        taskItem.childNodes[0].firstChild.width = width + "px";
        taskItem.childNodes[1].firstChild.width = width + "px";
        this.cTaskItem[0].childNodes[1].firstChild.rows[0].cells[0].innerHTML = countHours;
        taskItem.childNodes[2].childNodes[0].style.width = width + "px";
        taskItem.childNodes[2].childNodes[1].style.left = width - 10 + "px"
    };
    
GanttTask.prototype.endResizeItem = function()

{
        var taskItem = this.cTaskItem[0];
        this.wasResized = this.taskItemWidth != parseInt(taskItem.childNodes[0].firstChild.width);
        if (this.wasResized){
            var posXL = taskItem.offsetLeft;
            var posXR = taskItem.offsetLeft + parseInt(taskItem.childNodes[0].firstChild.width);
            this.TaskInfo.Duration = Math.round((posXR - posXL) / this.Chart.hourInPixelsWork);
            if (this.childPredTask.length > 0){
                for (var j = 0;j < this.childPredTask.length;j++){
                    this.childPredTask[j].cTaskItem[1][2].style.width = parseInt(this.childPredTask[j].cTaskItem[1][2].style.width) - (parseInt(taskItem.childNodes[0].firstChild.width) - this.taskItemWidth) + "px";
                    this.childPredTask[j].cTaskItem[1][2].style.left = parseInt(this.childPredTask[j].cTaskItem[1][2].style.left) + (parseInt(taskItem.childNodes[0].firstChild.width) - this.taskItemWidth) + "px";
                    this.childPredTask[j].cTaskItem[1][0].style.left = parseInt(this.childPredTask[j].cTaskItem[1][0].style.left) + (parseInt(taskItem.childNodes[0].firstChild.width) - this.taskItemWidth) + "px"
                }
            }
        };

        this.cTaskItem[0].childNodes[1].firstChild.rows[0].cells[0].innerHTML = "";
        this.checkResize = false;
        this.taskItemWidth = 0;
        this.MouseX = 0;
        if (this.Chart.isShowDescTask){
            this.showDescTask()
        };
    
        this.Project.shiftProjectItem();
        if (this.Chart._isFF)document.body.style.cursor = ""
    };
    
GanttProject.prototype.moveDescrProject = function()

{
        this.descrProject.style.left = (parseInt(this.projectItem[0].style.left) + this.Duration * this.Chart.hourInPixelsWork + 10);
        this.descrProject.innerHTML = this.getDescStr()
    };
    
GanttProject.prototype.showDescrProject = function()

{
        var posX = (parseInt(this.projectItem[0].style.left) + this.Duration * this.Chart.hourInPixelsWork + 10);
        this.descrProject.style.left = posX + "px";
        this.descrProject.style.visibility = 'visible';
        this.descrProject.innerHTML = this.getDescStr()
    };
    
GanttProject.prototype.hideDescrProject = function()

{
        this.descrProject.style.visibility = 'hidden'
    };
    
GanttProject.prototype.getDescStr = function()

{
        var str = '', delim = ", ";
        for (var i = 0;i < this.Chart.paramShowProject.length;i++){
            switch (this.Chart.paramShowProject[i]) {
                case "Name":
                    if (str != "")str += delim;
                    str += this.Project[this.Chart.paramShowProject[i]];
                    break;
                case "StartDate":
                    if (str != "")str += delim;
                    var d = this.Project[this.Chart.paramShowProject[i]];
                    str += d.getDate() + "." + (d.getMonth() + 1) + "." + d.getFullYear();
                    break;
                case "Duration":
                    if (str != "")str += delim;
                    str += this[this.Chart.paramShowProject[i]] + "h";
                    break;
                case "percentCompleted":
                    if (str != "")str += delim;
                    str += this[this.Chart.paramShowProject[i]] + "%";
                    break;
                default:
                    break
            }
        };
    
        return str
    };

GanttProject.prototype.createDescrProject = function()

{
        var posX = (this.posX + this.Duration * this.Chart.hourInPixelsWork + 10);
        var divDesc = document.createElement("div");
        divDesc.style.cssText += ";z-index:1;position:absolute;left:" + posX + "px;top:" + this.posY + "px;";
        divDesc.innerHTML = this.getDescStr();
        divDesc.className = "descProject";
        this.descrProject = divDesc;
        if (this.Project.ParentTasks.length == 0){
            this.descrProject.style.visibility = 'hidden'
        };
        
        if (this.Chart._showTooltip){
            var self = this;
            var getPopUpInfo = function(e) {
                if ((!self.Chart._isMove)&& (!self.Chart._isResize)) self.getPopUpInfo(self.descrProject, e)
            };
                
            var closePopUpInfo = function() {
                self.closePopUpInfo()
            };
            
            this.addEvent(divDesc, 'mouseover', getPopUpInfo, false);
            this.addEvent(divDesc, 'mouseout', closePopUpInfo, false)
        };
        
        return divDesc
    };
    
GanttProject.prototype.createProjectItem = function()

{
        var self = this;
        this.percentCompleted = this.getPercentCompleted();
        this.Duration = this.getDuration();
        var projectItem = document.createElement("div");
        projectItem.id = this.Project.Id;
        projectItem.style.cssText = ";z-index:1;position: absolute;left:" + this.posX + "px;top:" + this.posY + "px;";
        projectItem.style.width = this.Duration * this.Chart.hourInPixelsWork + "px";
        var tblProjectItem = document.createElement("table");
        projectItem.appendChild(tblProjectItem);
        tblProjectItem.cellPadding = "0";
        tblProjectItem.cellSpacing = "0";
        tblProjectItem.style.cssText = "border: solid 1px #BC810D;";
        var width = this.Duration * this.Chart.hourInPixelsWork;
        tblProjectItem.width = ((width == 0) ? 1 : width) + "px";
        tblProjectItem.style.width = ((width == 0) ? 1 : width) + "px";
        var rowprojectItem = tblProjectItem.insertRow(tblProjectItem.rows.length);
        if (this.percentCompleted != -1){
            if (this.percentCompleted != 0){
                var cellprojectItem = document.createElement("TD");
                rowprojectItem.appendChild(cellprojectItem);
                cellprojectItem.width = this.percentCompleted + "%";
                cellprojectItem.style.lineHeight = "1px";
                var imgPr = document.createElement("img");
                imgPr.style.width = (this.percentCompleted * this.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
                imgPr.style.height = this.Chart.heightTaskItem + "px";
                cellprojectItem.appendChild(imgPr);
                imgPr.src = this.Chart.imgs + "parentnode_filled.png"
            };
            
            if (this.percentCompleted != 100){
                var cellprojectItem = document.createElement("TD");
                rowprojectItem.appendChild(cellprojectItem);
                cellprojectItem.width = (100 - this.percentCompleted) + "%";
                cellprojectItem.style.lineHeight = "1px";
                var imgPr = document.createElement("img");
                imgPr.style.width = ((100 - this.percentCompleted) * this.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
                imgPr.style.height = this.Chart.heightTaskItem + "px";
                cellprojectItem.appendChild(imgPr);
                imgPr.src = this.Chart.imgs + "progress_bg.png"
            }
        }else
        {
            var cellprojectItem = document.createElement("TD");
            rowprojectItem.appendChild(cellprojectItem);
            cellprojectItem.width = "1px";
            cellprojectItem.style.lineHeight = "1px";
            var imgPr = document.createElement("img");
            imgPr.style.width = "1px";
            imgPr.style.height = this.Chart.heightTaskItem;
            cellprojectItem.appendChild(imgPr);
            imgPr.src = this.Chart.imgs + "progress_bg.png"
        };
    
        var divTaskInfo = document.createElement("div");
        divTaskInfo.style.cssText = "text-align:center;z-index:2;position:absolute;left:0px;top:0px;";
        var tblTaskInfo = document.createElement("table");
        divTaskInfo.appendChild(tblTaskInfo);
        tblTaskInfo.cellPadding = "0";
        tblTaskInfo.cellSpacing = "0";
        tblTaskInfo.height = this.Chart.heightTaskItem + "px";
        tblTaskInfo.width = ((this.Duration * this.Chart.hourInPixelsWork == 0) ? 1 : this.Duration * this.Chart.hourInPixelsWork) + "px";
        var rowTaskInfo = tblTaskInfo.insertRow(0);
        var cellTaskInfo = document.createElement("td");
        cellTaskInfo.align = "center";
        cellTaskInfo.vAlign = "top";
        cellTaskInfo.height = this.Chart.heightTaskItem + "px";
        cellTaskInfo.className = "moveInfo";
        cellTaskInfo.style.cssText = ";white-space:nowrap;";
        rowTaskInfo.appendChild(cellTaskInfo);
        projectItem.appendChild(divTaskInfo);
        if (this.Project.ParentTasks.length == 0){
            projectItem.style.display = "none"
        };
    
        if (this.Chart._showTooltip){
            var getPopUpInfo = function(e) {
                if ((!self.Chart._isMove)&& (!self.Chart._isResize)) self.getPopUpInfo(self.projectItem[0], e)
            };
            
            var closePopUpInfo = function() {
                self.closePopUpInfo()
            };
        
            this.addEvent(divTaskInfo, 'mouseover', getPopUpInfo, false);
            this.addEvent(divTaskInfo, 'mouseout', closePopUpInfo, false)
        };
    
        return projectItem
    };

GanttProject.prototype.createProjectNameItem = function()

{
        var self = this;
        var divName = document.createElement("div");
        divName.style.cssText = "cursor:pointer;color:#003366;font-weight:bold;font-size:12px;font-family:Tahoma,Arial;white-space:nowrap;height:15px;z-index:1;position:absolute;left:" + 5 + "px;top:" + this.posY + "px;";
        divName.innerHTML = this.Project.Name;
        divName.title = this.Project.Name;
        if (this.Chart.isShowConMenu){
            var showContMenu = function(event) {
                if (self.Chart.contextMenu.clear)self.Chart.contextMenu.clear();
                var hideContMenu = null;
                if (!self.Chart._isIE){
                    hideContMenu = function() {
                        self.Chart.contextMenu.hideContextMenu();
                        self.Chart.content.removeEventListener("mousedown", hideContMenu, false)
                    }
                }else

                {
                    hideContMenu = function() {
                        self.Chart.contextMenu.hideContextMenu();
                        self.Chart.content.detachEvent("mousedown", hideContMenu)
                    }
                };
        
                self.Chart.content.onmousedown = hideContMenu;
                if (!self.Chart._isIE){
                    event.stopPropagation()
                }else

                {
                    event.cancelBubble = true
                };
        
                self.Chart._showContextMenu(event, self)
            };
    
            if (this.Chart._isIE){
                this.addEvent(divName, "contextmenu", function(e) {
                    showContMenu(e);
                    return false
                }, false)
            }else
            {
                this.addEvent(divName, "contextmenu", function(e) {
                    e.preventDefault();
                    showContMenu(e)
                }, false)
            }
        };

        return divName
    };

GanttProject.prototype.getPercentCompleted = function()

{
        var sum = 0;
        var percentCompleted = 0;
        for (var i = 0;i < this.Project.ParentTasks.length;i++){
            sum += parseInt(this.Project.ParentTasks[i].PercentCompleted)
        };
        
        if (this.Project.ParentTasks.length != 0){
            return percentCompleted = Math.round(sum / this.Project.ParentTasks.length)
        }else {
            return percentCompleted = -1
        }
    };

GanttProject.prototype.getDuration = function()

{
        var duration = 0;
        var tmpDuration = 0;
        if (this.Project.ParentTasks.length > 0){
            for (var i = 0;i < this.Project.ParentTasks.length;i++){
                tmpDuration = this.Project.ParentTasks[i].Duration * 24 / this.Chart.hoursInDay + (this.Project.ParentTasks[i].EST - this.Chart.startDate) / (60 * 60 * 1000);
                if (tmpDuration > duration){
                    duration = tmpDuration
                }
            };
        
            return ((duration - this.posX) / 24) * this.Chart.hoursInDay
        }else
        {
            return 0
        }
    };

GanttProject.prototype.getId = function()

{
        return this.Project.Id
    };
    
GanttProject.prototype.getName = function()

{
        return this.Project.Name
    };
    
GanttProject.prototype.getStartDate = function()

{
        return this.Project.StartDate
    };
    
GanttTask.prototype.addEvent = function (elm, evType, fn, useCapture)

{
        if (elm.addEventListener){
            elm.addEventListener(evType, fn, useCapture);
            return true
        }else if (elm.attachEvent){
            return elm.attachEvent('on' + evType, fn)
        }else {
            elm['on' + evType] = fn
        }
    };

GanttTask.prototype.startMove = function (event)

{
        this.moveChild = event.ctrlKey;
        this.MouseX = event.screenX;
        this.getMoveInfo();
        this.checkMove = true;
        if (this.Chart.isShowDescTask){
            this.hideDescTask()
        };
        
        if (this.Chart._isFF)document.body.style.cursor = "move";
        if (this.Chart._isIE)event.srcElement.style.cursor = "move"
    };
        
GanttTask.prototype.showDescTask = function()

{
        var posX = (parseInt(this.cTaskItem[0].style.left) + this.TaskInfo.Duration * this.Chart.hourInPixelsWork + 10);
        this.descrTask.style.left = posX + "px";
        this.descrTask.innerHTML = this.getDescStr();
        this.descrTask.style.visibility = 'visible'
    };
    
GanttTask.prototype.hideDescTask = function()

{
        this.descrTask.style.visibility = 'hidden'
    };
    
GanttTask.prototype.getDescStr = function()

{
        var str = '', delim = ", ";
        for (var i = 0;i < this.Chart.paramShowTask.length;i++){
            var prop = this.Chart.paramShowTask[i], propValue = this.TaskInfo[prop];
            switch (prop) {
                case "Name":
                    if (str != "")str += delim;
                    str += propValue;
                    break;
                case "EST":
                    if (str != "")str += delim;
                    str += propValue.getDate() + "." + (propValue.getMonth() + 1) + "." + propValue.getFullYear();
                    break;
                case "S-F":
                    if (str != "")str += delim;
                    propValue = this.TaskInfo["EST"];
                    str += propValue.getDate() + "." + (propValue.getMonth() + 1) + "." + propValue.getFullYear() + " - ";
                    propValue = this.getFinishDate();
                    str += propValue.getDate() + "." + (propValue.getMonth() + 1) + "." + propValue.getFullYear();
                    break;
                case "Duration":
                    if (str != "")str += delim;
                    str += propValue + "h";
                    break;
                case "PercentCompleted":
                    if (str != "")str += delim;
                    str += propValue + "%";
                    break;
                default:
                    break
            }
        };
    
        return str
    };

GanttTask.prototype.getId = function()

{
        return this.TaskInfo.Id
    };
    
GanttTask.prototype.getName = function()

{
        return this.TaskInfo.Name
    };
    
GanttTask.prototype.getDuration = function()

{
        return this.TaskInfo.Duration
    };
    
GanttTask.prototype.getEST = function()

{
        return this.TaskInfo.EST
    };
    
GanttTask.prototype.getFinishDate = function()

{
        var date = new Date(this.TaskInfo.EST);
        date.setDate(date.getDate() + parseInt((this.TaskInfo["Duration"]-1)/this.Chart.hoursInDay+1)-1);
        return date
    };
    
GanttTask.prototype.getPercentCompleted = function()

{
        return this.TaskInfo.PercentCompleted
    };
    
GanttTask.prototype.getPredecessorTaskId = function()

{
        return this.TaskInfo.PredecessorTaskId ? this.TaskInfo.PredecessorTaskId : null
    };
    
GanttTask.prototype.getParentTaskId = function()

{
        return this.parentTask ? this.parentTask.getId() : null
    };
    
GanttTask.prototype.moveDescTask = function()

{
        var posX = (parseInt(this.cTaskItem[0].style.left) + this.TaskInfo.Duration * this.Chart.hourInPixelsWork + 10);
        this.descrTask.style.left = posX + "px"
    };
    
GanttTask.prototype.getMoveInfo = function()

{
        this.posX = parseInt(this.cTaskItem[0].style.left);
        var widthTaskItem = parseInt(this.cTaskItem[0].childNodes[0].firstChild.width);
        var posParentTaskItem = (this.parentTask == null) ? 0 : parseInt(this.parentTask.cTaskItem[0].style.left);
        var posPredTaskItem = (this.predTask == null) ? 0 : parseInt(this.predTask.cTaskItem[0].style.left) + parseInt(this.predTask.cTaskItem[0].childNodes[0].firstChild.width);
        var widthParentTaskItem = (this.parentTask == null) ? 0 : parseInt(this.parentTask.cTaskItem[0].childNodes[0].firstChild.width);
        var childPredPosX = 0;
        var childParentPosX = 0;
        var childParentPosXR = 0;
        if (this.childPredTask.length > 0){
            var posChildTaskItem = null;
            for (var n = 0;n < this.childPredTask.length;n++){
                if ((!posChildTaskItem)|| ((posChildTaskItem) && (posChildTaskItem > parseInt(this.childPredTask[n].cTaskItem[0].style.left))))

                {
                    posChildTaskItem = parseInt(this.childPredTask[n].cTaskItem[0].style.left)
                }
            };
        
            childPredPosX = posChildTaskItem
        };
    
        if (this.childTask.length > 0){
            var posChildTaskItemR = null;
            for (var n = 0;n < this.childTask.length;n++){
                if ((!posChildTaskItemR)|| ((posChildTaskItemR) && (posChildTaskItemR > (parseInt(this.childTask[n].cTaskItem[0].style.left)))))

                {
                    posChildTaskItemR = parseInt(this.childTask[n].cTaskItem[0].style.left)
                }
            };
    
            childParentPosXR = posChildTaskItemR;
            var posChildTaskItem = null;
            for (var n = 0;n < this.childTask.length;n++){
                if ((!posChildTaskItem)|| ((posChildTaskItem) && (posChildTaskItem < (parseInt(this.childTask[n].cTaskItem[0].style.left) + parseInt(this.childTask[n].cTaskItem[0].firstChild.firstChild.width)))))

                {
                    posChildTaskItem = parseInt(this.childTask[n].cTaskItem[0].style.left) + parseInt(this.childTask[n].cTaskItem[0].firstChild.firstChild.width)
                }
            };

            childParentPosX = posChildTaskItem
        };

        if (!this.moveChild){
            if (this.childPredTask.length > 0){
                if (this.maxPosXMove < childPredPosX)this.maxPosXMove = childPredPosX
            };
            
            if (this.childTask.length > 0){
                if ((this.childPredTask.length > 0)&& (this.maxPosXMove - widthTaskItem) > childParentPosXR) this.maxPosXMove = this.maxPosXMove - ((this.maxPosXMove - widthTaskItem) - childParentPosXR);
                if (!(this.childPredTask.length > 0)) this.maxPosXMove = childParentPosXR + widthTaskItem;
                this.minPosXMove = (childParentPosX - widthTaskItem)
            };
        
            if (posParentTaskItem > 0){
                if ((!(this.childPredTask.length > 0)) && (this.childTask.length > 0)) {
                    if (this.maxPosXMove > posParentTaskItem + widthParentTaskItem){
                        this.maxPosXMove = posParentTaskItem + widthParentTaskItem
                    }
                };
        
                if (this.minPosXMove <= posParentTaskItem){
                    this.minPosXMove = posParentTaskItem
                };
        
                if ((!(this.childTask.length > 0)) && (!(this.childPredTask.length > 0))) {
                    this.maxPosXMove = posParentTaskItem + widthParentTaskItem
                }else if ((!(this.childTask.length > 0)) && (this.childPredTask.length > 0)) {
                    if ((posParentTaskItem + widthParentTaskItem)> posPredTaskItem) {
                        this.maxPosXMove = childPredPosX
                    }
                }
            };

            if (posPredTaskItem > 0){
                if (this.minPosXMove <= posPredTaskItem){
                    this.minPosXMove = posPredTaskItem
                }
            };

            if ((posPredTaskItem == 0)&& (posParentTaskItem == 0)) {
                if (this.minPosXMove <= this.Chart.initialPos){
                    this.minPosXMove = this.Chart.initialPos
                }
            }
        }else
        {
            if ((posParentTaskItem > 0)&& (posPredTaskItem == 0))

            {
                this.minPosXMove = posParentTaskItem;
                this.maxPosXMove = posParentTaskItem + widthParentTaskItem
            }else if ((posParentTaskItem == 0)&& (posPredTaskItem == 0))

            {
                this.minPosXMove = this.Chart.initialPos;
                this.maxPosXMove = -1
            }else if ((posParentTaskItem > 0)&& (posPredTaskItem > 0))

            {
                this.minPosXMove = posPredTaskItem;
                this.maxPosXMove = posParentTaskItem + widthParentTaskItem
            }else if ((posParentTaskItem == 0)&& (posPredTaskItem > 0))

            {
                this.minPosXMove = posPredTaskItem;
                this.maxPosXMove = -1
            };
        
            if ((this.parentTask)&& (this.childPredTask.length > 0))

            {
                var posChildTaskItem = this.getMaxPosPredChildTaskItem(this);
                var posParentTaskItem = parseInt(this.parentTask.cTaskItem[0].style.left) + parseInt(this.parentTask.cTaskItem[0].firstChild.firstChild.width);
                this.maxPosXMove = this.posX + widthTaskItem + posParentTaskItem - posChildTaskItem
            }
        }
    };

GanttTask.prototype.startResize = function(event)

{
        this.MouseX = event.screenX;
        this.getResizeInfo();
        if (this.Chart.isShowDescTask){
            this.hideDescTask()
        };
        
        this.checkResize = true;
        this.taskItemWidth = parseInt(this.cTaskItem[0].firstChild.firstChild.width);
        if (this.Chart._isFF)document.body.style.cursor = "e-resize"
    };
        
GanttTask.prototype.getResizeInfo = function()

{
        var taskItem = this.cTaskItem[0];
        var posParentTaskItem = (this.parentTask == null) ? 0 : parseInt(this.parentTask.cTaskItem[0].style.left);
        var widthParentTaskItem = (this.parentTask == null) ? 0 : parseInt(this.parentTask.cTaskItem[0].childNodes[0].firstChild.width);
        var posTaskItem = parseInt(this.cTaskItem[0].style.left);
        var childPredPosX = 0;
        var childParentPosX = 0;
        if (this.childPredTask.length > 0){
            var posChildTaskItem = null;
            for (var n = 0;n < this.childPredTask.length;n++){
                if ((!posChildTaskItem)|| ((posChildTaskItem) && (posChildTaskItem > parseInt(this.childPredTask[n].cTaskItem[0].style.left))))

                {
                    posChildTaskItem = parseInt(this.childPredTask[n].cTaskItem[0].style.left)
                }
            };
        
            childPredPosX = posChildTaskItem
        };
    
        if (this.childTask.length > 0){
            var posChildTaskItem = null;
            for (var n = 0;n < this.childTask.length;n++){
                if ((!posChildTaskItem)|| ((posChildTaskItem) && (posChildTaskItem < (parseInt(this.childTask[n].cTaskItem[0].style.left) + parseInt(this.childTask[n].cTaskItem[0].firstChild.firstChild.width)))))

                {
                    posChildTaskItem = parseInt(this.childTask[n].cTaskItem[0].style.left) + parseInt(this.childTask[n].cTaskItem[0].firstChild.firstChild.width)
                }
            };
    
            childParentPosX = posChildTaskItem
        };

        this.minWidthResize = this.Chart.dayInPixels;
        if (this.childTask.length > 0){
            this.minWidthResize = childParentPosX - posTaskItem
        };
    
        if ((this.childPredTask.length > 0)&& (!this.parentTask))
        {
            this.maxWidthResize = childPredPosX - posTaskItem
        }else if ((this.childPredTask.length > 0)&& (this.parentTask))
        {
            var w1 = posParentTaskItem + widthParentTaskItem - posTaskItem;
            var w2 = childPredPosX - posTaskItem;
            this.maxWidthResize = Math.min(w1, w2)
        }else if ((this.childPredTask.length == 0)&& (this.parentTask))
        {
            this.maxWidthResize = posParentTaskItem + widthParentTaskItem - posTaskItem
        }
    };

GanttTask.prototype.createTaskItem = function()

{
        var self = this;
        this.posX = this.Chart.getPosOnDate(this.TaskInfo.EST);
        var itemControl = document.createElement("div");
        itemControl.id = this.TaskInfo.Id;
        itemControl.style.cssText = ";z-index:1;position:absolute;left:" + this.posX + "px;top:" + this.posY + "px;";
        var divTaskItem = document.createElement("div");
        itemControl.appendChild(divTaskItem);
        divTaskItem.style.cssText = "z-index:1;position: absolute;left:0px;top:0px;";
        var tblTaskItem = document.createElement("table");
        divTaskItem.appendChild(tblTaskItem);
        tblTaskItem.cellPadding = "0";
        tblTaskItem.cellSpacing = "0";
        tblTaskItem.width = this.TaskInfo.Duration * this.Chart.hourInPixelsWork + "px";
        tblTaskItem.style.cssText = "border: solid 1px #6589A9;";
        var rowTblTask = tblTaskItem.insertRow(tblTaskItem.rows.length);
        if (this.TaskInfo.PercentCompleted != 0){
            var cellTblTask = document.createElement("td");
            rowTblTask.appendChild(cellTblTask);
            cellTblTask.height = this.Chart.heightTaskItem + "px";
            cellTblTask.width = this.TaskInfo.PercentCompleted + "%";
            cellTblTask.style.lineHeight = "1px";
            var imgPr = document.createElement("img");
            imgPr.style.width = (this.TaskInfo.PercentCompleted * this.TaskInfo.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
            imgPr.style.height = this.Chart.heightTaskItem + "px";
            cellTblTask.appendChild(imgPr);
            imgPr.src = this.Chart.imgs + "progress_filled.png"
        };
        
        if (this.TaskInfo.PercentCompleted != 100){
            var cellTblTask = document.createElement("td");
            rowTblTask.appendChild(cellTblTask);
            cellTblTask.height = this.Chart.heightTaskItem + "px";
            cellTblTask.width = (100 - this.TaskInfo.PercentCompleted) + "%";
            cellTblTask.style.lineHeight = "1px";
            var imgPrF = document.createElement("img");
            imgPrF.style.width = ((100 - this.TaskInfo.PercentCompleted) * this.TaskInfo.Duration * this.Chart.hourInPixelsWork) / 100 + "px";
            imgPrF.style.height = this.Chart.heightTaskItem + "px";
            cellTblTask.appendChild(imgPrF);
            imgPrF.src = this.Chart.imgs + "progress_bg.png"
        };
        
        if (this.Chart.isEditable){
            var divTaskInfo = document.createElement("div");
            divTaskInfo.style.cssText = "text-align:center;font-size:9px;z-index:2;position: absolute;left:0px;top:0px;";
            var tblTaskInfo = document.createElement("table");
            divTaskInfo.appendChild(tblTaskInfo);
            tblTaskInfo.cellPadding = "0";
            tblTaskInfo.cellSpacing = "0";
            tblTaskInfo.height = this.Chart.heightTaskItem + "px";
            tblTaskInfo.width = this.TaskInfo.Duration * this.Chart.hourInPixelsWork + "px";
            var rowTaskInfo = tblTaskInfo.insertRow(0);
            var cellTaskInfo = document.createElement("TD");
            cellTaskInfo.align = "center";
            cellTaskInfo.vAlign = "top";
            cellTaskInfo.height = this.Chart.heightTaskItem + "px";
            cellTaskInfo.className = "moveInfo";
            cellTaskInfo.style.cssText = ";white-space:nowrap;font-size:9px";
            rowTaskInfo.appendChild(cellTaskInfo);
            itemControl.appendChild(divTaskInfo)
        };
        
        var divTaskName = document.createElement("div");
        itemControl.appendChild(divTaskName);
        divTaskName.style.cssText = ";z-index:2;position: absolute;left:0px;top:0px;";
        var divMove = document.createElement("div");
        divMove.innerHTML = "<input type='text' style='visibility:hidden;width:1px;height:1px;'/>";
        if (this.Chart._isIE){
            divMove.style.background = "#000000";
            divMove.style.filter = "alpha(opacity=0)"
        };
        
        divMove.style.height = this.Chart.heightTaskItem + "px";
        divMove.style.width = this.TaskInfo.Duration * this.Chart.hourInPixelsWork + "px";
        divTaskName.appendChild(divMove);
        if (this.Chart._showTooltip){
            var getPopUpInfo = function(e) {
                if ((!self.Chart._isMove)&& (!self.Chart._isResize)) self.getPopUpInfo(self.cTaskItem[0], e)
            };
                
            var closePopUpInfo = function() {
                self.closePopUpInfo()
            };
            
            this.addEvent(divMove, 'mouseover', getPopUpInfo, false);
            this.addEvent(divMove, 'mouseout', closePopUpInfo, false)
        };
        
        var taskClick = function() {
            self.Chart.callEvent("onTaskClick", [self])
        };
        
        this.addEvent(divMove, 'click', taskClick, false);
        if (this.Chart.isEditable){
            var divResize = document.createElement("div");
            divResize.style.cssText = ";z-index:10;position: absolute;left:" + (this.TaskInfo.Duration * this.Chart.hourInPixelsWork - 10) + "px;top:0px;";
            divResize.style.height = this.Chart.heightTaskItem + "px";
            divResize.style.width = "10px";
            divResize.innerHTML = "<input type='text' style='visibility:hidden;width:1px;height:1px;'/>";
            divTaskName.appendChild(divResize);
            var startMove = function(e) {
                if (self.Chart.callEvent("onTaskStartDrag", [self])===false) return;
                var moveItem = function(e1) {
                    if (self.checkMove)self.moveItem(e1)
                };
                    
                var endMove = function() {
                    if (self.checkMove){
                        self.endMove();
                        self.Chart._isMove = false;
                        if (self.Chart._isIE){
                            document.body.releaseCapture();
                            document.detachEvent("onmousemove", moveItem);
                            document.detachEvent("onmouseup", endMove)
                        }else {
                            document.removeEventListener("mousemove", moveItem, true);
                            document.removeEventListener("mouseup", endMove, true)
                        };
                        
                        if (self.wasMoved)self.Chart.callEvent("onTaskEndDrag", [self])
                    }
                };
            
                self.addEvent(document, 'mousemove', moveItem, true);
                self.addEvent(document, 'mouseup', endMove, true);
                if (self.Chart._showTooltip)self.closePopUpInfo();
                self.startMove(e);
                self.Chart._isMove = true;
                if (self.Chart._isIE)document.body.setCapture(false)
            };
            
            var startResize = function(e) {
                if (self.Chart.callEvent("onTaskStartResize", [self])===false) return;
                var resizeItem = function(e1) {
                    if (self.checkResize)self.resizeItem(e1)
                };
                
                var endResizeItem = function() {
                    if (self.checkResize){
                        self.endResizeItem();
                        self.Chart._isResize = false;
                        if (self.Chart._isIE){
                            document.body.releaseCapture();
                            document.detachEvent("onmousemove", resizeItem);
                            document.detachEvent("onmouseup", endResizeItem)
                        }else {
                            document.removeEventListener("mousemove", resizeItem, true);
                            document.removeEventListener("mouseup", endResizeItem, true)
                        };
                    
                        if (self.wasResized)self.Chart.callEvent("onTaskEndResize", [self])
                    }
                };
        
                self.addEvent(document, 'mousemove', resizeItem, false);
                self.addEvent(document, 'mouseup', endResizeItem, false);
                self.startResize(e);
                if (self.Chart._isIE)document.body.setCapture(false);
                self.Chart._isResize = true
            };
    
            this.addEvent(divMove, 'mousedown', startMove, false);
            this.addEvent(divResize, 'mousedown', startResize, false);
            var setCursorResize = function(e2) {
                if (!self.Chart._isMove)(e2.srcElement?e2.srcElement:e2.target).style.cursor = "e-resize"
            };
        
            var setCursorStandart = function(e3) {
                if (!self.checkResize)(e3.srcElement?e3.srcElement:e3.target).style.cursor = ""
            };
        
            this.addEvent(divResize, 'mouseover', setCursorResize, false);
            this.addEvent(divResize, 'mouseout', setCursorStandart, false)
        };
    
        return itemControl
    };

GanttTask.prototype.createTaskNameItem = function(hasChildren)

{
        var self = this;
        var divName = document.createElement("div");
        divName.id = this.TaskInfo.Id;
        divName.style.cssText = "cursor:pointer;white-space:nowrap;height:15px;z-index:1;position:absolute;left:20px;top: " + this.posY + "px;";
        if (hasChildren)divName.style.fontWeight = "bold";
        divName.className = "taskNameItem";
        divName.title = this.TaskInfo.Name;
        divName.innerHTML = this.TaskInfo.Name;
        if (this.Chart.isShowConMenu){
            var showContMenu = function(event) {
                if (self.Chart.contextMenu.clear)self.Chart.contextMenu.clear();
                var hideContMenu = function() {
                    self.Chart.contextMenu.hideContextMenu();
                    if (self.Chart._isIE)self.Chart.content.detachEvent("mousedown", hideContMenu);else
                        self.Chart.content.removeEventListener("mousedown", hideContMenu, false)
                };
                    
                self.Chart.content.onmousedown = hideContMenu;
                if (!self.Chart._isIE){
                    event.stopPropagation()
                }else

                {
                    event.cancelBubble = true
                };
                
                self.Chart._showContextMenu(event, self)
            };
            
            if (this.Chart._isIE){
                this.addEvent(divName, "contextmenu", function(e) {
                    showContMenu(e);
                    return false
                }, false)
            }else

            {
                this.addEvent(divName, "contextmenu", function(e) {
                    e.preventDefault();
                    showContMenu(e)
                }, false)
            }
        };
    
        return divName
    };

GanttTask.prototype.createTaskDescItem = function()

{
        var posX = (this.posX + this.TaskInfo.Duration * this.Chart.hourInPixelsWork + 10);
        var divDesc = document.createElement("div");
        divDesc.style.cssText += ";z-index:1;position:absolute;left:" + posX + "px;top:" + this.posY + "px;";
        divDesc.innerHTML = this.getDescStr();
        divDesc.className = "descTask";
        this.descrTask = divDesc;
        if (this.Chart._showTooltip){
            var self = this;
            var getPopUpInfo = function(e) {
                if ((!self.Chart._isMove)&& (!self.Chart._isResize)) self.getPopUpInfo(self.descrTask, e)
            };
                
            var closePopUpInfo = function() {
                self.closePopUpInfo()
            };
            
            this.addEvent(divDesc, 'mouseover', getPopUpInfo, false);
            this.addEvent(divDesc, 'mouseout', closePopUpInfo, false)
        };
        
        return divDesc
    };
    
GanttTask.prototype.checkWidthTaskNameItem = function()

{
        if (this.cTaskNameItem[0].offsetWidth + this.cTaskNameItem[0].offsetLeft > this.Chart.maxWidthPanelNames){
            var width = this.cTaskNameItem[0].offsetWidth + this.cTaskNameItem[0].offsetLeft - this.Chart.maxWidthPanelNames;
            var countChar = Math.round(width / (this.cTaskNameItem[0].offsetWidth / this.cTaskNameItem[0].firstChild.length));
            var tName = this.TaskInfo.Name.substring(0, this.cTaskNameItem[0].firstChild.length - countChar - 3);
            tName += "...";
            this.cTaskNameItem[0].innerHTML = tName
        }
    };

GanttTask.prototype.create = function()

{
        var containerTasks = this.Chart.oData.firstChild;
        var containerNames = null;
        if (this.Chart._showTreePanel)containerNames = this.Chart.panelNames.firstChild;
        var predecessorTask = this.TaskInfo.PredecessorTask;
        var parentTask = this.TaskInfo.ParentTask;
        var isCParentTask = (this.TaskInfo.ChildTasks.length > 0);
        var self = this;
        this.cTaskItem = [];
        this.cTaskNameItem = [];
        if (!parentTask){
            if (this.TaskInfo.previousParentTask){
                this.previousParentTask = this.Project.getTaskById(this.TaskInfo.previousParentTask.Id);
                var lastChildTask = this.Chart.getLastChildTask(this.previousParentTask);
                this.posY = parseInt(lastChildTask.cTaskItem[0].style.top) + this.Chart.heightTaskItem + 11;
                this.previousParentTask.nextParentTask = this
            }else {
                this.posY = parseInt(this.Project.projectItem[0].style.top) + this.Chart.heightTaskItem + 11
            }
        };
    
        if (parentTask){
            var task = this.Project.getTaskById(this.TaskInfo.ParentTask.Id);
            this.parentTask = task;
            if (this.TaskInfo.previousChildTask){
                this.previousChildTask = this.Project.getTaskById(this.TaskInfo.previousChildTask.Id);
                var lastChildTask = this.Chart.getLastChildTask(this.previousChildTask);
                this.posY = parseInt(lastChildTask.cTaskItem[0].style.top) + this.Chart.heightTaskItem + 11;
                this.previousChildTask.nextChildTask = this
            }else {
                this.posY = parseInt(task.cTaskItem[0].style.top) + this.Chart.heightTaskItem + 11
            };
        
            task.childTask.push(this)
        };
    
        if (predecessorTask){
            var task = this.Project.getTaskById(predecessorTask.Id);
            this.predTask = task;
            task.childPredTask.push(this)
        };
    
        this.cTaskItem.push(this.createTaskItem());
        containerTasks.appendChild(this.cTaskItem[0]);
        if (this.Chart.panelNames){
            this.cTaskNameItem.push(this.createTaskNameItem(isCParentTask));
            this.Chart.panelNames.firstChild.appendChild(this.cTaskNameItem[0])
        };
    
        if (this.Chart.isShowDescTask){
            containerTasks.appendChild(this.createTaskDescItem())
        };
    
        var arrConnectingLines = [];
        if (predecessorTask)arrConnectingLines = this.createConnectingLinesDS();
        this.cTaskItem.push(arrConnectingLines);
        if (this.Chart.panelNames){
            var arrConnectingLinesNames = [];
            if (parentTask){
                this.cTaskNameItem[0].style.left = parseInt(this.parentTask.cTaskNameItem[0].style.left) + 15 + "px";
                arrConnectingLinesNames = this.createConnectingLinesPN()
            };
        
            this.checkWidthTaskNameItem();
            var treeImg = null;
            if (isCParentTask)treeImg = this.createTreeImg();
            this.cTaskNameItem.push(arrConnectingLinesNames);
            this.cTaskNameItem.push(treeImg)
        };
    
        this.addDayInPanelTime();
        return this
    };
    
GanttTask.prototype.createTreeImg = function()

{
        var self = this;
        var treeImg = new Image();
        treeImg.src = this.Chart.imgs + "minus.gif";
        treeImg.id = this.TaskInfo.Id;
        treeImg.onclick = function()

        {
            if (self._isOpen){
                this.src = self.Chart.imgs + "plus.gif";
                self._isOpen = false;
                self.hideChildTasks(self);
                self.shiftCurrentTasks(self, -self._heightHideTasks)
            }else

            {
                this.src = self.Chart.imgs + "minus.gif";
                self._isOpen = true;
                self.shiftCurrentTasks(self, self._heightHideTasks);
                self.showChildTasks(self, true);
                self._heightHideTasks = 0
            }
        };
    
        this.Chart.panelNames.firstChild.appendChild(treeImg);
        treeImg.style.cssText = "cursor:pointer;left:" + (parseInt(this.cTaskNameItem[0].style.left) - 12) + "px;top:" + (parseInt(this.cTaskNameItem[0].style.top) + 3) + "px;z-index:12;position:absolute;";
        return treeImg
    };
    
GanttChart.prototype.getLastChildTask = function(task)

{
        if (task.childTask.length > 0){
            return this.getLastChildTask(task.childTask[task.childTask.length - 1])
        }else

        {
            return task
        }
    };

dhtmlXMLSenderObject = function(ganttChart)

{
        this.xmlHttp = this.createXMLHttpRequest();
        this.isProcessed = false;
        this.path = null;
        this.filename = null;
        this.Chart = ganttChart
    };
    
dhtmlXMLSenderObject.prototype.createXMLHttpRequest = function()

{
        if (window.XMLHttpRequest){
            return new XMLHttpRequest()
        }else if (window.ActiveXObject){
            return new ActiveXObject("Microsoft.XMLHTTP")
        }
    };

dhtmlXMLSenderObject.prototype.sendData = function(filename, path, xmlData)

{
        var self = this;
        this.path = path;
        this.filename = filename;
        if ((this.path == null)|| (this.path == ""))

        {
            this.Chart.Error.throwError("DATA_SEND_ERROR", 3, null);
            return
        };
    
        if ((this.filename == null)|| (this.filename == ""))

        {
            this.Chart.Error.throwError("DATA_SEND_ERROR", 4, null);
            return
        };
    
        this.isProcessed = true;
        this.xmlHttp.open("POST", this.path, true);
        if (this.Chart._isFF){
            this.xmlHttp.onerror = function() {
                self.xmlHttp.onreadystatechange = null;
                self.xmlHttp.abort();
                self.isProcessed = false
            }
        };
    
        this.xmlHttp.onreadystatechange = function() {
            self.getStatus()
        };
    
        this.xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        this.xmlHttp.send("data=" + encodeURI(xmlData) + "&filename=" + filename)
    };
    
dhtmlXMLSenderObject.prototype.getStatus = function()

{
        if (this.xmlHttp.readyState == 4){
            var _status = "";
            try {
                _status = this.xmlHttp.status
            }catch(e) {
                this.Chart.Error.throwError("DATA_SEND_ERROR", 1, null);
                return 0
            };
            
            switch (_status) {
                case 0:
                    this.Chart.Error.throwError("DATA_SEND_ERROR", 1, null);
                    break;
                case 404:
                    this.Chart.Error.throwError("DATA_SEND_ERROR", 5, [this.path]);
                    break;
                case 500:
                    this.Chart.Error.throwError("DATA_SEND_ERROR", 2, null);
                    break;
                case 12029:
                    this.Chart.Error.throwError("DATA_SEND_ERROR", 1, null);
                    break;
                default:
                    if (!(_status >= 200 && _status < 300 || _status == 304))
                    {
                        this.Chart.Error.throwError("DATA_SEND_ERROR", 0, null)
                    };
                    
                    break
            };
                
            this.isProcessed = false
        }
    };

function GanttError() {
    this.catches = [];
    this._errors = [];
    this._init();
    return this
};
    
GanttError.prototype._init = function()

{
        this._errors[0] = "Connection error";
        this._errors[1] = "Cannot connect";
        this._errors[2] = "Server error";
        this._errors[3] = "Path is null or empty";
        this._errors[4] = "Filename is null or empty";
        this._errors[5] = "File (%0) is not found";
        this._errors[6] = "Percent Complete should be a number";
        this._errors[7] = "Percent Complete should be <= 100";
        this._errors[8] = "Percent Complete should be >= 0";
        this._errors[9] = "Increase duration of task(%0)";
        this._errors[10] = "Reduce duration of task(%0)";
        this._errors[11] = "Increase EST of child task (%0)";
        this._errors[12] = "Reduce EST of task (%0)";
        this._errors[13] = "The project (%0) is added";
        this._errors[14] = "Start Date of the project < start Date of the control";
        this._errors[15] = "Task (%0) cannot be the child of predecessor task(%1)";
        this._errors[16] = "Time of the termination of predecessor task(%0) > EST of child task(%1)";
        this._errors[17] = "The Predecessor (%0) task does not exist";
        this._errors[18] = "The EST of task (%0) < start date of the control";
        this._errors[19] = "Time of the termination of parent task (%0) < time of the termination of child task(%1)";
        this._errors[20] = "The EST of task (%0) < EST of parent task(%1)";
        this._errors[21] = "The parent task (%0) does not exist";
        this._errors[22] = "The task (%0) is added";
        this._errors[23] = "The project (%0) is added";
        this._errors[24] = "Task (%0) EST < project (%1) startDate";
        this._errors[25] = "Parent task (%0) EST cannot be null";
        this._errors[26] = "Predecessor task (%0) position error. Reduce duration of predecessor task (%0) or increase EST of child task (%1)";
        this._errors[27] = "Predecessor task (%0) does not exist";
        this._errors[28] = "Increase duration of parent task (%0) or reduce EST of child task (%1) or reduce duration of child task(%1)";
        this._errors[29] = "Reduce EST of parent task (%0) or increase EST of child task (%1)";
        this._errors[30] = "The task(%0) does not exist";
        this._errors[31] = "The project(%0) does not exist";
        this._errors[32] = "Predecessor task(%0) and child task(%1) should have the same parent";
        this._errors[33] = "Reduce EST of parent task (%0) or increase EST of child task (%1)";
        this._errors[34] = "EST of task(%0) < start date of the project(%1)";
        this._errors[35] = "Percent Complete should be <= 100 and >= 0";
        this._errors[36] = "You may not connect a task to itself.";
        this._errors[37] = "Cannot parse this XML string."
    };
    
GanttError.prototype.catchError = function(type, handler) {
    this.catches[type] = handler
};
    
GanttError.prototype.getErrorString = function(str, params)

{
        if (!params){
            return str
        }else {
            for (var i = 0;i < params.length;i++){
                var re = new RegExp("%" + i, "gi");
                str = str.replace(re, params[i])
            };
            
            return str
        }
    };

GanttError.prototype.throwError = function(type, description, params) {
    if (this.catches[type]){
        var index = parseInt(description);
        var errorStr = this.getErrorString(this._errors[index], params);
        return this.catches[type](type, errorStr, params)
    };
        
    return null
};
    
function contextMenu(chart)
{
    this.Chart = chart;
    this.TabContainer = null;
    this.MenuPanel = null;
    this.tabPanel = null;
    this.arrTabs = [];
    this.isShow = false;
    this.hideDiv = null;
    this._init()
};
    
contextMenu.prototype._init = function()

{
        this.createMenuPanel();
        this.createHideDiv();
        this.createTabContainer();
        this.createTabPanel();
        var self = this;
        var arrItems = [];
        var tab1 = this.createTab(1, "Rename task", "t", true, this);
        tab1.addItem(1, "New name", document.createElement("input"), "text", function() {
            tab1.arrItems[0].control.focus()
        });
        tab1.addItem(2, "Rename", document.createElement("input"), "button",
            function() {
                var name = tab1.arrItems[0].control.value;
                try {
                    tab1.object.setName(name);
                    tab1.hide()
                }catch(e) {}
            });
        var tab2 = this.createTab(2, "Delete task", "t", true, this);
        tab2.addItem(1, "Delete", document.createElement("input"), "button",
            function()
            {
                try {
                    tab2.object.Project.deleteTask(tab2.object.TaskInfo.Id);
                    tab2.hide()
                }catch(e) {}
            });
        var tab3 = this.createTab(3, "Set EST", "t", true, this);
        tab3.addItem(1, "EST", document.createElement("input"), "text", function() {
            tab3.arrItems[0].control.focus()
        });
        tab3.addItem(2, "Move children", document.createElement("input"), "checkbox", function() {
            tab3.arrItems[1].control.focus()
        });
        tab3.addItem(3, "Update", document.createElement("input"), "button",
            function() {
                var isMoveChild = tab3.arrItems[1].control.checked;
                var arr = tab3.arrItems[0].control.value.split(".");
                var est = (arr.length < 3) ? null : (new Date(arr[2], parseInt(arr[1]) - 1, arr[0]));
                try {
                    if (tab3.object.setEST(est, isMoveChild)) tab3.hide()
                }catch(e) {}
            });
        var tab4 = this.createTab(4, "Set duration", "t", true, this);
        tab4.addItem(1, "Duration", document.createElement("input"), "text", function() {
            tab4.arrItems[0].control.focus()
        });
        tab4.addItem(2, "Update", document.createElement("input"), "button",
            function() {
                var d = tab4.arrItems[0].control.value;
                try {
                    if (tab4.object.setDuration(d)) tab4.hide()
                }catch(e) {}
            });
        var tab5 = this.createTab(5, "Set % complete", "t", true, this);
        tab5.addItem(1, "Percent Complete", document.createElement("input"), "text", function() {
            tab5.arrItems[0].control.focus()
        });
        tab5.addItem(2, "Update", document.createElement("input"), "button",
            function() {
                var p = tab5.arrItems[0].control.value;
                try {
                    if (tab5.object.setPercentCompleted(p)) tab5.hide()
                }catch(e) {}
            });
        var tab13 = this.createTab(13, "Set predecessor", "t", true, this);
        tab13.addItem(1, "Predecessor", document.createElement("input"), "text", function() {
            tab13.arrItems[0].control.focus()
        });
        tab13.addItem(2, "Update", document.createElement("input"), "button",
            function() {
                var p = tab13.arrItems[0].control.value;
                try {
                    if (tab13.object.setPredecessor(p)) tab13.hide()
                }catch(e) {}
            });
        var tab6 = this.createTab(6, "Rename project", "p", true, this);
        tab6.addItem(1, "New name", document.createElement("input"), "text", function() {
            tab6.arrItems[0].control.focus()
        });
        tab6.addItem(2, "Rename", document.createElement("input"), "button",
            function() {
                var name = tab6.arrItems[0].control.value;
                try {
                    tab6.object.setName(name);
                    tab6.hide()
                }catch(e) {}
            });
        var tab7 = this.createTab(7, "Delete project", "p", true, this);
        tab7.addItem(1, "Delete", document.createElement("input"), "button",
            function() {
                try {
                    tab7.object.Chart.deleteProject(tab7.object.Project.Id);
                    tab7.hide()
                }catch(e) {}
            });
        var tab8 = this.createTab(8, "Set % complete", "p", true, this);
        tab8.addItem(1, "Percent Complete", document.createElement("input"), "text", function() {
            tab8.arrItems[0].control.focus()
        });
        tab8.addItem(2, "Update", document.createElement("input"), "button",
            function() {
                var p = tab8.arrItems[0].control.value;
                try {
                    if (tab8.object.setPercentCompleted(p)) tab8.hide()
                }catch(e) {}
            });
        var tab9 = this.createTab(9, "Add new task", "p", true, this);
        tab9.addItem(1, "Id", document.createElement("input"), "text", function() {
            tab9.arrItems[0].control.focus()
        });
        tab9.addItem(2, "Name", document.createElement("input"), "text", function() {
            tab9.arrItems[1].control.focus()
        });
        tab9.addItem(3, "EST", document.createElement("input"), "text", function() {
            tab9.arrItems[2].control.focus()
        });
        tab9.addItem(4, "Duration", document.createElement("input"), "text", function() {
            tab9.arrItems[3].control.focus()
        });
        tab9.addItem(5, "Percent complete", document.createElement("input"), "text", function() {
            tab9.arrItems[4].control.focus()
        });
        tab9.addItem(6, "Parent task id", document.createElement("input"), "text", function() {
            tab9.arrItems[5].control.focus()
        });
        tab9.addItem(7, "Pred task id", document.createElement("input"), "text", function() {
            tab9.arrItems[6].control.focus()
        });
        tab9.addItem(9, "Insert", document.createElement("input"), "button",
            function() {
                try {
                    var id = tab9.arrItems[0].control.value;
                    var name = tab9.arrItems[1].control.value;
                    var arr = tab9.arrItems[2].control.value.split(".");
                    var est = (arr.length < 3) ? null : (new Date(arr[2], parseInt(arr[1]) - 1, arr[0]));
                    var duration = tab9.arrItems[3].control.value;
                    var pc = tab9.arrItems[4].control.value;
                    var parentTaskId = tab9.arrItems[5].control.value;
                    var predTaskId = tab9.arrItems[6].control.value;
                    if (tab9.object.insertTask(id, name, est, duration, pc, predTaskId, parentTaskId)) tab9.hide()
                }catch(e) {}
            });
        var tab11 = this.createTab(11, "Add successor task", "t", true, this);
        tab11.addItem(1, "Id", document.createElement("input"), "text", function() {
            tab11.arrItems[0].control.focus()
        });
        tab11.addItem(2, "Name", document.createElement("input"), "text", function() {
            tab11.arrItems[1].control.focus()
        });
        tab11.addItem(3, "EST", document.createElement("input"), "text", function() {
            tab11.arrItems[2].control.focus()
        });
        tab11.addItem(4, "Duration", document.createElement("input"), "text", function() {
            tab11.arrItems[3].control.focus()
        });
        tab11.addItem(5, "Percent complete", document.createElement("input"), "text", function() {
            tab11.arrItems[4].control.focus()
        });
        tab11.addItem(6, "Insert", document.createElement("input"), "button",
            function() {
                try {
                    var pr = tab11.object.Project;
                    var id = tab11.arrItems[0].control.value;
                    var name = tab11.arrItems[1].control.value;
                    var arr = tab11.arrItems[2].control.value.split(".");
                    var est = (arr.length < 3) ? null : (new Date(arr[2], parseInt(arr[1]) - 1, arr[0]));
                    var duration = tab11.arrItems[3].control.value;
                    var pc = tab11.arrItems[4].control.value;
                    var parentTaskId = (tab11.object.parentTask == null) ? "" : tab11.object.parentTask.TaskInfo.Id;
                    var predTaskId = tab11.object.TaskInfo.Id;
                    if (pr.insertTask(id, name, est, duration, pc, predTaskId, parentTaskId)) tab11.hide()
                }catch(e) {}
            });
        var tab10 = this.createTab(10, "Add child task", "t", true, this);
        tab10.addItem(1, "Id", document.createElement("input"), "text", function() {
            tab10.arrItems[0].control.focus()
        });
        tab10.addItem(2, "Name", document.createElement("input"), "text", function() {
            tab10.arrItems[1].control.focus()
        });
        tab10.addItem(3, "EST", document.createElement("input"), "text", function() {
            tab10.arrItems[2].control.focus()
        });
        tab10.addItem(4, "Duration", document.createElement("input"), "text", function() {
            tab10.arrItems[3].control.focus()
        });
        tab10.addItem(5, "Percent complete", document.createElement("input"), "text", function() {
            tab10.arrItems[4].control.focus()
        });
        tab10.addItem(6, "Insert", document.createElement("input"), "button",
            function() {
                try {
                    var pr = tab10.object.Project;
                    var id = tab10.arrItems[0].control.value;
                    var name = tab10.arrItems[1].control.value;
                    var arr = tab10.arrItems[2].control.value.split(".");
                    var est = (arr.length < 3) ? null : (new Date(arr[2], parseInt(arr[1]) - 1, arr[0]));
                    var duration = tab10.arrItems[3].control.value;
                    var pc = tab10.arrItems[4].control.value;
                    var parentTaskId = tab10.object.TaskInfo.Id;
                    var predTaskId = "";
                    if (pr.insertTask(id, name, est, duration, pc, predTaskId, parentTaskId)) tab10.hide()
                }catch(e) {}
            });
        var tab12 = this.createTab(12, "-Insert new project-", "p", false, this);
        tab12.addItem(1, "Id", document.createElement("input"), "text", function() {
            tab12.arrItems[0].control.focus()
        });
        tab12.addItem(2, "Name", document.createElement("input"), "text", function() {
            tab12.arrItems[1].control.focus()
        });
        tab12.addItem(3, "Start date", document.createElement("input"), "text", function() {
            tab12.arrItems[2].control.focus()
        });
        tab12.addItem(4, "Insert", document.createElement("input"), "button",
            function() {
                try {
                    var id = tab12.arrItems[0].control.value;
                    var namePr = tab12.arrItems[1].control.value;
                    var arr = tab12.arrItems[2].control.value.split(".");
                    var startDatePr = (arr.length < 3) ? null : (new Date(arr[2], parseInt(arr[1]) - 1, arr[0]));
                    if (self.Chart.insertProject(id, namePr, startDatePr)) tab12.hide()
                }catch(e) {}
            })
    };

contextMenu.prototype.createHideDiv = function()

{
        this.hideDiv = document.createElement("div");
        this.hideDiv.style.position = "absolute";
        this.hideDiv.style.left = "0px";
        this.hideDiv.style.top = "0px";
        this.Chart.content.appendChild(this.hideDiv);
        this.hideDiv.style.zIndex = 12;
        this.hideDiv.style.display = "none";
        this.hideDiv.style.background = "#7D7E7D";
        this.hideDiv.style.cssText += ";-moz-opacity: 0.5;filter: alpha(opacity=50);opacity:.50;";
        this.hideDiv.style.width = this.Chart.content.offsetWidth + 2 + "px";
        this.hideDiv.style.height = this.Chart.content.offsetHeight + 2 + "px"
    };
    
contextMenu.prototype.createMenuPanel = function()

{
        this.MenuPanel = document.createElement("div");
        this.MenuPanel.style.visibility = "hidden";
        this.MenuPanel.style.cssText += ";z-index:10;";
        this.MenuPanel.style.position = "absolute";
        this.Chart.content.appendChild(this.MenuPanel);
        this.MenuPanel.innerHTML = "<table></table>";
        this.MenuPanel.firstChild.className = "contextMenu";
        this.MenuPanel.firstChild.cellPadding = 0;
        this.MenuPanel.firstChild.cellSpacing = 0;
        this.MenuPanel.firstChild.style.cssText += ";background:url(" + this.Chart.imgs + "menu/menu_bg.png);"
    };
    
contextMenu.prototype.createTabPanel = function()

{
        this.tabPanel = document.createElement("div");
        this.tabPanel.style.visibility = "hidden";
        this.tabPanel.style.zIndex = "30";
        this.TabContainer.firstChild.rows[0].cells[0].appendChild(this.tabPanel);
        this.tabPanel.style.width = "385px";
        this.tabPanel.style.height = "290px";
        this.tabPanel.innerHTML = "<table><tr><td></td></tr><tr><td></td></tr></table>";
        this.tabPanel.firstChild.cellPadding = 0;
        this.tabPanel.firstChild.cellSpacing = 0;
        this.tabPanel.firstChild.style.cssText = "width:385px;border: 1px solid #808080;";
        this.tabPanel.firstChild.rows[0].cells[0].style.cssText = ";height:26px;background:url(" + this.Chart.imgs + "/menu/window_tr.png);background-repeat: no-repeat;color:#fff;font-size:14px;font-weight: bold;font-family: Tahoma, Arial";
        this.tabPanel.firstChild.rows[0].cells[0].align = "center";
        this.tabPanel.firstChild.rows[1].cells[0].style.cssText = ";height:270px;background:#F7F7F7;";
        this.tabPanel.firstChild.rows[1].cells[0].innerHTML = "<table></table>";
        this.tabPanel.firstChild.rows[1].cells[0].firstChild.style.cssText = "width:250px;font-size:11px;font-family:Tahoma,Arial;";
        this.tabPanel.firstChild.rows[1].cells[0].align = "center"
    };
    
contextMenu.prototype.addItemMenuPanel = function(tab)

{
        var self = this;
        var row = this.MenuPanel.firstChild.insertRow(this.MenuPanel.firstChild.rows.length);
        var cell = document.createElement('td');
        cell.innerHTML = tab.Description;
        cell.style.cssText = "padding-left:10px;height:18px;";
        this.addEvent(cell, "mousedown", function() {
            tab.show()
        }, false);
        cell.onmouseover = function() {
            this.style.background = "url(" + self.Chart.imgs + "menu/menu_selection.png)"
        };
        
        cell.onmouseout = function() {
            this.style.background = ""
        };
        
        row.appendChild(cell)
    };
    
contextMenu.prototype.showContextMenu = function(x, y, object)

{
        if (object.constructor == GanttTask){
            for (var i = 0;i < this.arrTabs.length;i++){
                if (this.arrTabs[i].type == "t"){
                    this.arrTabs[i].object = object;
                    this.addItemMenuPanel(this.arrTabs[i])
                }
            }
        }else if (object.constructor == GanttProject){
            for (var i = 0;i < this.arrTabs.length;i++){
                if (this.arrTabs[i].type == "p"){
                    this.arrTabs[i].object = object;
                    this.addItemMenuPanel(this.arrTabs[i])
                }
            }
        };

        this.isShow = true;
        this.MenuPanel.style.cssText += ";z-index:15;";
        this.MenuPanel.style.visibility = "visible";
        this.MenuPanel.style.top = parseInt(y) + this.Chart.heightTaskItem - this.Chart.oData.scrollTop + 5 + "px";
        this.MenuPanel.style.left = x
    };

contextMenu.prototype.hideContextMenu = function()

{
        this.isShow = false;
        this.MenuPanel.style.visibility = "hidden"
    };
    
contextMenu.prototype.clear = function()

{
        this.MenuPanel.removeChild(this.MenuPanel.firstChild);
        this.MenuPanel.innerHTML = "<table></table>";
        this.MenuPanel.firstChild.className = "contextMenu";
        this.MenuPanel.firstChild.cellPadding = 0;
        this.MenuPanel.firstChild.cellSpacing = 0;
        this.MenuPanel.firstChild.style.cssText += ";background:url(" + this.Chart.imgs + "menu/menu_bg.png);"
    };
    
contextMenu.prototype.createTab = function(id, desc, type, showOInfo, menu)

{
        var tab = new contextMenuTab(id, desc, type, showOInfo, menu);
        this.arrTabs.push(tab);
        return tab
    };
    
contextMenu.prototype.createTabContainer = function()

{
        this.TabContainer = document.createElement("div");
        this.TabContainer.style.position = "absolute";
        this.TabContainer.style.top = "0px";
        this.TabContainer.style.left = "0px";
        this.TabContainer.style.visibility = "hidden";
        this.TabContainer.style.zIndex = "50";
        this.Chart.content.appendChild(this.TabContainer);
        this.TabContainer.innerHTML = "<table><tr><td></td></tr></table>";
        this.TabContainer.firstChild.style.cssText = ";width:100%;height:100%;";
        this.TabContainer.firstChild.rows[0].cells[0].align = "center";
        this.TabContainer.style.width = this.Chart.content.offsetWidth + 2 + "px";
        this.TabContainer.style.height = this.Chart.content.offsetHeight + 2 + "px"
    };
    
contextMenu.prototype.getTabById = function(id)

{
        for (var i = 0;i < this.arrTabs.length;i++){
            if (this.arrTabs[i].Id == id){
                return this.arrTabs[i]
            }
        };
    
        return null
    };

function contextMenuTab(id, description, type, showOInfo, contextMenu)
{
    this.Id = id;
    this.arrItems = [];
    this.TabItemContainer = null;
    this.Description = description;
    this.contextMenu = contextMenu;
    this.type = type;
    this.object = null;
    this.showObjectInfo = showOInfo
};
    
contextMenu.prototype.addEvent = function (elm, evType, fn, useCapture)

{
        if (elm.addEventListener){
            elm.addEventListener(evType, fn, useCapture);
            return true
        }else if (elm.attachEvent){
            return elm.attachEvent('on' + evType, fn)
        }else {
            elm['on' + evType] = fn
        }
    };

contextMenuTab.prototype.addItem = function(id, name, control, type, handler)

{
        if (handler){
            control.onclick = handler
        };
        
        control.type = type;
        if (type == "button"){
            control.value = name
        };
        
        var tabItem = new contextMenuTabItem(id, name, control, this);
        this.arrItems.push(tabItem)
    };
    
contextMenuTab.prototype.show = function()

{
        this.contextMenu.hideDiv.style.display = "inline";
        this.contextMenu.TabContainer.style.visibility = "visible";
        var self = this;
        this.contextMenu.tabPanel.firstChild.rows[0].cells[0].innerHTML = this.Description;
        this.contextMenu.tabPanel.style.visibility = "visible";
        var t = this.contextMenu.tabPanel.firstChild.rows[1].cells[0].firstChild;
        var c,c2,r = null;
        if (this.showObjectInfo){
            if (this.object){
                if (this.object.constructor == GanttTask){
                    this.insertData(t, "Id", this.object.TaskInfo.Id);
                    this.insertData(t, "Name", this.object.TaskInfo.Name);
                    this.insertData(t, "Duration", this.object.TaskInfo.Duration + " hrs");
                    this.insertData(t, "Percent complete", this.object.TaskInfo.PercentCompleted + "%");
                    this.insertData(t, "EST", this.object.TaskInfo.EST.getDate() + "." + (this.object.TaskInfo.EST.getMonth() + 1) + "." + this.object.TaskInfo.EST.getFullYear());
                    this.insertData(t, "Predecessor", this.object.TaskInfo.PredecessorTaskId)
                }else

                {
                    this.insertData(t, "Id", this.object.Project.Id);
                    this.insertData(t, "Name", this.object.Project.Name);
                    this.insertData(t, "Start date", this.object.Project.StartDate.getDate() + "." + (this.object.Project.StartDate.getMonth() + 1) + "." + this.object.Project.StartDate.getFullYear())
                }
            }
        };

        var btnCell = null;
        for (var i = 0;i < this.arrItems.length;i++){
            if (this.arrItems[i].control.type == "button"){
                r = t.insertRow(t.rows.length);
                c = r.insertCell(r.cells.length);
                btnCell = r.insertCell(r.cells.length);
                btnCell.appendChild(this.arrItems[i].control)
            }else

            {
                r = t.insertRow(t.rows.length);
                c = r.insertCell(r.cells.length);
                c2 = r.insertCell(r.cells.length);
                c.innerHTML = this.arrItems[i].Name;
                c2.appendChild(this.arrItems[i].control)
            }
        };

        var b = document.createElement("input");
        b.type = "button";
        b.value = "Cancel";
        b.onclick = function()
        {
            self.hide()
        };
    
        if (!btnCell){
            r = t.insertRow(t.rows.length);
            c = r.insertCell(r.cells.length);
            btnCell = r.insertCell(r.cells.length)
        }else {
            b.style.marginLeft = "10px"
        };
    
        btnCell.appendChild(b)
    };

contextMenuTab.prototype.hide = function()

{
        this.contextMenu.tabPanel.style.visibility = "hidden";
        var t = this.contextMenu.tabPanel.firstChild.rows[1].cells[0].firstChild;
        t.parentNode.removeChild(t);
        this.contextMenu.tabPanel.firstChild.rows[1].cells[0].innerHTML = "<table></table>";
        this.contextMenu.tabPanel.firstChild.rows[1].cells[0].firstChild.style.cssText = "width:250px;font-size:11px;font-family:Tahoma,Arial;";
        this.contextMenu.hideDiv.style.display = "none";
        this.contextMenu.TabContainer.style.visibility = "hidden"
    };
    
contextMenuTab.prototype.insertData = function(t, name, value)

{
        var c,c2,r = null;
        r = t.insertRow(t.rows.length);
        c = r.insertCell(r.cells.length);
        c.style.cssText = "width:100px";
        c.innerHTML = name;
        c2 = r.insertCell(r.cells.length);
        c2.innerHTML = value
    };
    
contextMenuTab.prototype.insertControl = function(t, name, value)

{
        var c,c2,r = null;
        r = t.insertRow(t.rows.length);
        c = r.insertCell(r.cells.length);
        c.innerHTML = name;
        c2 = r.insertCell(r.cells.length);
        c2.appendChild(value)
    };
    
function contextMenuTabItem(id, name, control, tab)
{
    this.Id = id;
    this.Name = name;
    this.control = control;
    this.tab = tab
};
//v.1.3 build 9733

/*
Copyright DHTMLX LTD. http://www.dhtmlx.com
*/